Git를 사용하여 여러 작업 디렉토리를 가질 수 있는 방법은 무엇입니까?
이것이 Git에 의해 뒷받침되는 것인지는 잘 모르겠지만, 이론적으로는 저에게 효과가 있을 것 같습니다.
워크플로우에는 여러 분기에 있는 파일을 동시에 편집하는 작업이 포함되는 경우가 많습니다.즉, 다른 분기에 있는 다른 파일의 내용을 편집하는 동안 한 분기에서 몇 개의 파일을 열고 싶은 경우가 많습니다.
이에 대한 저의 전형적인 해결책은 체크아웃을 두 번 하는 것인데, 지점과 레퍼런스를 공유할 수 없다는 것이 아쉽습니다.은 두 한 두개작디의것렉 업 토 리 디 에 서 하 관 는 은 리.git
폴더를 누릅니다.
현지인들은 알고 있습니다git clone
solutions 개체를및 ""(으)로 표시됨"(으)로 됨)--shared
repo를이지만 이러한 공간. "repo"의 에는 더욱 . 그러나 이러한 솔루션은 Disk 공간 사용만 줄여줍니다. 특히--shared
위태로워 보이다
사용할 수 있는 방법이 있습니까?.git
폴더, 그리고 그것에 의해 백업되는 두 개의 작업 디렉토리가 있습니까?아니면 Git는 한 번에 한 개의 작업 디렉토리만 체크아웃하도록 하드 코딩되어 있습니까?
2부터 Git 2.5를 할 것을 합니다.contrib/workdir/git-new-workdir
git worktree
주니오 C 하마노()gitster
의 커밋 68a2e6a를 참조하십시오.
릴리스 노트에는 다음이 언급되어 있습니다.
.
contrib/workdir/git-new-workdir
그것은 상징적인 연결에 의존하지 않고 차용인과 차용인이 서로를 인식하도록 함으로써 사물과 참조를 더 안전하게 공유합니다.
즉, 이제 다음 작업을 수행할 수 있습니다.
를 작성
<path>
체크아웃 체크웃<branch>
그 안에.새 작업 디렉터리는 현재 리포지토리에 연결되어 HEAD, 인덱스 등의 작업 디렉터리 관련 파일을 제외한 모든 파일을 공유합니다.섹션에는 다음 항목이 추가됩니다.Git 저장소는 여러 작업 트리를 지원할 수 있으므로 한 번에 둘 이상의 분기를 체크아웃할 수 있습니다.
와 함께git worktree add
새 작업 트리가 리포지토리와 연결되어 있습니다.이 새로운 작업 트리는 "" 또는
git clone
""에git init
의해 준비된 "주 작업 트리"와는 반대로 "연결된 작업 트리"라고 불립니다.
리포지토리에는 기본 작업 트리(기본 리포지토리가 아닌 경우)가 하나 있고 0개 이상의 연결된 작업 트리가 있습니다.
세부사항:
연결된 각 작업 트리에는 리포지토리의 디렉토리에 개인 하위 디렉토리가 있습니다.
개인 하위 디렉토리의 이름은 일반적으로 연결된 작업 트리 경로의 기본 이름이며, 고유한 이름으로 숫자가 추가될 수 있습니다.
예를 들어, 다음과 같은 경우$GIT_DIR=/path/main/.git
사부령라는git worktree add /path/other/test-next next
작성:
- 트리업된의 연결된
/path/other/test-next
그리고.- 또한 다음을 생성합니다.
$GIT_DIR/worktrees/test-next
디토리또)$GIT_DIR/worktrees/test-next1
한다면test-next
이미 사용됨).연결된 작업 트리 내:
$GIT_DIR
디렉토리를 가예설록정다니됩도키리를리디토이렉개인예(:)./path/main/.git/worktrees/test-next
①) ②$GIT_COMMON_DIR
는 주의 주작트의위치다를가설시정다니됩록도리키리업을 되어 있습니다.$GIT_DIR
(예:)/path/main/.git
).이러한 설정은 다음과 같이 이루어집니다.
.git
연결된 작업 트리의 상단 디렉터리에 있는 파일입니다.연결된 작업 트리를 완료하면 간단히 삭제할 수 있습니다.
관리 참조).gc.pruneworktreesexpire
git config
) 또는 를 실행할 수 있습니다.git worktree prune
오래된 관리 파일을 정리하기 위해 기본 또는 연결된 작업 트리에 있습니다.
하위 모듈에 대한 지원이 불완전합니다.
슈퍼 프로젝트를 여러 번 체크아웃하는 것은 권장되지 않습니다.
참고: git 2.7rc1(2015년 11월)을 사용하면 작업 트리를 나열할 수 있습니다.
커밋 bb9c03b, 커밋 92718b7, 커밋 5193490, 커밋 1ceb7f9, 커밋 1ceb7f9, 커밋 1ceb7f9(2015년 10월 8일), 커밋 92718b7, 커밋 1ceb7f9, 커밋 1ceb7f9(2015년 10월 8일), 커밋 5193490, 커밋 1commit 1ceb7f9(2015년 10월 9일), 커밋 9일(2015년 10월 9일(2015년 10월 9일), 커밋 9일), 커AC6c561 (2015년 10월 2일)을 Michael Rappazzo()rappazzo
에 의해 커밋합니다.
(주니오 C 하마노에 의해 합병 -- 46dcfb, 2015년 10월 26일 커밋)
worktree
'를 추가합니다.list
'
git worktree list
작업 트리 목록을 반복하고, 작업 트리의 경로, 현재 체크아웃된 리비전 및 분기, 작업 트리가 비어 있는지 여부 등 작업 트리에 대한 세부 정보를 출력합니다.git worktree list /path/to/bare-source (베어) /path/to/linked-worktree abcd1234 [master] /path/to/other-linked-worktree 1234abc (HEAD 분리됨)
도자기 포맷 옵션도 있습니다.
도자기 형식에는 속성별로 줄이 있습니다.
- 특성은 레이블 및 값과 함께 단일 공백으로 구분하여 나열됩니다.
- 부울 특성(예: 'bare' 및 'depached')은 레이블로만 나열되며 값이 참인 경우와 참인 경우에만 표시됩니다.
- 빈 줄은 작업 트리의 끝을 나타냅니다.
예를 들어:
$ git worktree list --porcelain
worktree /path/to/bare-source
bare
worktree /path/to/linked-worktree
HEAD abcd1234abcd1234abcd1234abcd1234abcd1234
branch refs/heads/master
worktree /path/to/other-linked-worktree
HEAD 1234abc1234abc1234abc1234abc1234abc1234a
detached
참고: 작업 트리 폴더를 이동하는 경우 파일을 수동으로 업데이트해야 합니다.
commit 618244e(2016년 1월 22일), d4cdd6(2016년 1월 18일)을 Nguyễn Thai Ngọc Duy()pclouds
의 커밋을 참조하십시오.
도움을 받은 사람: 에릭 sunshineco
선샤인().
(주니오 C 하마노에 의해 합병 -- 2016년 2월 10일 커밋 0a1cbc에서)
새로운 문서 2.8(2016년 3월)에는 다음이 포함됩니다.
연결된 작업 트리를 이동하는 경우 '을(를) 업데이트해야 합니다.
gitdir
항목의 디렉토리에 있는 파일입니다.
를 들어,를 예를들연작트결로 한 경우/newpath/test-next
그리고 그것들.git
가 파로포트를 가리킵니다./path/main/.git/worktrees/test-next
그 다음 업데이트/path/main/.git/worktrees/test-next/gitdir
고로참을/newpath/test-next
대신.
분기를 삭제할 때 주의하십시오. git 2.9(2016년 6월) 이전에는 다른 작업 트리에서 사용 중인 분기를 삭제할 수 있습니다.
"일 때"
git worktree
"사용 "git branch -d
다른 작업 트리에서 체크아웃된 분기를 삭제할 수 있습니다.
야마구치 가즈키()rhenium
의 커밋 f292244(2016년 3월 29일)를 참조하십시오.
도움을 받은 사람: 에릭 sunshineco
선샤인().
(주니오 C 하마노에 의해 합병 -- -- 2016년 4월 13일 커밋 4fca4e3에서)
branch -d
의 삭제를 합니다.
현재 작업 트리에서 분기를 체크아웃하면 분기 삭제가 금지됩니다.
그러나 분기가 다른 작업 트리에 의해서만 체크아웃되는 경우, 삭제가 잘못 성공합니다.
사용하다find_shared_symref()
현재 작업 트리의 HEAD와 비교할 뿐만 아니라 분기가 사용 중인지 확인합니다.
마찬가지로 git 2.9(2016년 6월) 이전에는 다른 워크트리에서 체크아웃한 분기의 이름을 변경해도 해당 다른 워크트리의 기호 HEAD가 조정되지 않았습니다.
커밋 18eb3a9(2016년 4월 8일), 커밋 70999e9, 커밋 2233066(rhenium
2016년 3월 27일) 야마구치 가즈키() 참조.
(주니오 C 하마노에 의해 합병 -- -- 741a694, 2016년 4월 18일 커밋)
branch -m
모든 작업별 HEAD 업데이트
분기 이름을 바꿀 때 현재 작업 트리의 HEAD만 업데이트되지만 이전 분기를 가리키는 모든 작업 트리의 HEAD는 업데이트되어야 합니다.
다음은 현재 동작입니다. /path/to/wt의 HEAD가 업데이트되지 않습니다.
% git worktree list /path/to 2c3c5f2 [master] /path/to/wt 2c3c5f2 [oldname] % git branch -m master master2 % git worktree list /path/to 2c3c5f2 [master2] /path/to/wt 2c3c5f2 [oldname] % git branch -m oldname newname % git worktree list /path/to 2c3c5f2 [master2] /path/to/wt 0000000 [oldname]
이 패치는 분기 이름을 변경할 때 관련 워크트리 HEAD를 모두 업데이트하여 이 문제를 해결합니다.
잠금 메커니즘은 Git 2.10에서 공식적으로 지원됩니다(2016년 3분기).
커밋 080739b, 커밋 6d30862, 커밋 58142c0, 커밋 346ef53, 커밋 58142c0, 커밋 346ef53, 커밋 346ef53(2016년 6월 13일), 커밋 984ad9e, 커밋 6835314(2016년 6월 3일)를 Nguyễn Thángọ Duy(pclouds
)에 의해 커밋합니다.
제안자: 에릭 sunshineco
선샤인().
(주니오 C 하마노에 의해 합병 -- -- 커밋 2c608e0, 2016년 7월 28일)
git worktree lock [--reason <string>] <worktree>
git worktree unlock <worktree>
연결된 작업 트리가 항상 마운트되지 않은 휴대용 장치 또는 네트워크 공유에 저장되어 있는 경우 다음 명령을 실행하여 해당 관리 파일이 제거되는 것을 방지할 수 있습니다.
git worktree lock
명령, 선택적으로 지정--reason
작업 트리가 잠긴 이유를 설명합니다.
<worktree>
작업 트리 경로의 마지막 경로 구성 요소가 작업 트리 간에 고유한 경우 작업 트리를 식별하는 데 사용할 수 있습니다.
예를 들어, "에서 트리를 작업해야 하는 경우"/abc/def/ghi
그리고 "/abc/def/ggg
그 다음에ghi
또는 "def/ghi
이전 작업 트리를 가리키기에 충분합니다.
Git 2.13(2017년 2분기)은 Nguyễn Thai Ngọc Duy()pclouds
의 커밋 507e6e9(2017년 4월 12일)에 옵션을 추가합니다.
제안자: David dt
Taylor().
도움을 받은 사람: 제프 peff
킹().
(주니오 C 하마노에 의해 합병되었습니다 -- -- 311597, 2017년 4월 26일 위원회에서)
작업 트리를 만든 후 즉시 잠글 수 있습니다.
이는 "사이의 경쟁을 방지하는 데 도움이 됩니다.git worktree add; git worktree lock
그리고 "git worktree prune
".
그렇게git worktree add' --lock
의 값과 같습니다.git worktree lock
끝나고git worktree add
하지만 인종 조건은 없습니다.
Git 2.17+ (2018년 2분기) 추가git worktree move
/git worktree remove
이 답을 보세요.
Git 2.19 (2018년 3분기) " 추가--quiet
만들 수 있는 옵션 "git worktree add
덜 장황한
Elia Pinto()devzero2000
의 commit 371979c(2018년 8월 15일)를 참조하십시오.
Martin Ogren martin.agren@gmail.com , Duy pclouds
Nguyen(), Eric Sunshine().sunshineco
(주니오 C 하마노에 의해 합병 -- -- 988ce9, 2018년 8월 27일 커밋)
worktree
덧셈--quiet
선택
'을 추가합니다.
--quiet
에 대한 선택권.git worktree
다른 하나는git
명령을 실행합니다.
'add
'를 제외한 다른 모든 명령 이후로 이 명령에 영향을 받는 유일한 명령입니다.list
현재 기본적으로 자동입니다.
참고: "git worktree add
"stat으로 사용 가능한 이름 찾기"를 수행하는 데 사용됩니다.mkdir
인종 차별이 심합니다
이것은 Git 2.22 (2019년 2분기)에서 다음을 사용하여 수정되었습니다.mkdir
그리고 반응합니다.EEXIST
고리 모양으로
마이클 수차넥()hramrach
의 커밋 7af01f2(2019년 2월 20일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 ---- 커밋 20fe798, 2019년 4월 9일)
worktree
고치다, 고치다, 고치다, 고치다worktree add
경주
Git는 stat 루프를 실행하여 사용 가능한 워크트리 이름을 찾은 다음 실행합니다.
mkdir
기명으로
로 돌립니다.mkdir
루프 - 작업 트리 추가의 다른 호출을 방지하기 위해 동일한 사용 가능한 이름을 찾고 디렉터리를 먼저 만듭니다.
Git 2.22 (2019년 2분기)는 Git 저장소에 작동 트리 보호 기능이 있는지 여부를 판단하는 논리를 수정합니다."git branch -D
실수로 현재 체크아웃된 분기를 제거할 수 없습니다.
이 논리의 구현은 비정상적인 이름을 가진 저장소에 대한 것으로, 안타깝게도 오늘날의 하위 모듈에 대한 표준입니다.
Jonathan jhowtan
Tan()의 commit f3534c9(2019년 4월 19일)를 참조하십시오.
(Junio C Hamano에 의해 합병됨 -- -- commit ec2642a, 2019년 5월 8일)
worktree
최신 정보is_bare
휴리스틱
"일 때"
git branch -D <name>
실행되며, Git는 일반적으로 해당 분기가 현재 체크아웃되었는지 먼저 확인합니다.
그러나 해당 리포지토리의 Git 디렉토리가 "에 없는 경우에는 이 검사가 수행되지 않습니다.<repo>/.git
이는 저장소가 Git 디렉토리가 "로 저장된 하위 모듈인 경우입니다.super/.git/modules/<repo>
예를 들면
이렇게 하면 체크아웃된 분기가 삭제됩니다.그 이유는
get_main_worktree()
에worktree.c
놓다is_bare
워크트리의 경로가 "로 끝나지 않는 경우 레포가 비어 있다는 휴리스틱만 사용하여 워크트리에서/.git
그 외에는 벌거벗지 않습니다.
이것.is_bare
코드는 92718b7에 도입되었습니다.worktree
작업 트리 구조에 세부 정보 추가", 2015-10-08, Git v2.7.0-rc0)에 이어pre-core.bare
휴리스틱의이 패치는 다음 두 가지 작업을 수행합니다.
- 가르치다
get_main_worktree()
사용할is_bare_repository()
대신 7d1864c("Introduct is_bare_repository() 및 core.bare 구성 변수 소개", 2007-01-07, Git v1.5.0-rc1)에 도입되었으며 e90fdc3("작업 트리 처리 정리", 2007-08-01, Git v1.5.3-rc4)에 업데이트되었습니다.
이것은 "를 해결합니다.git branch -D <name>
위에서 설명한 문제
하지만...- 리포지토리에 다음이 있는 경우
core.bare=1
하지만"git
2차 작업 트리 중 하나에서 명령이 실행되고 있습니다.is_bare_repository()
false를 반환합니다(사용 가능한 작업 트리가 있으므로 괜찮습니다).
또한 기본 작업 트리가 비어 있는 경우 기본 작업 트리를 비어 있지 않은 것으로 처리하면 문제가 발생합니다. 예를 들어 기본 작업 트리의 HEAD에서 참조되는 보조 작업 트리에서 분기를 삭제하지 못하는 경우가 있습니다.이를 방지하려면 다음 항목도 확인하십시오.
core.bare
설정 시is_bare
.
한다면core.bare=1
신뢰하고, 그렇지 않으면 사용합니다.is_bare_repository()
.
Git 2.29 (2020년 4분기)와 함께, "worktree
API는 워크트리 경로를 더 잘 결정할 수 있습니다.
커밋 918d8ff, 커밋 1c4854e, 커밋 246756f, 커밋 62573a5(2020년 7월 31일) 참조.sunshineco
(주니오 C 하마노에 의해 합병 -- 197253e, 2020년 8월 10일 커밋)
가짜 및 불필요한 경로 멍게를
worktree
제거합니다.사인 오프 바이: 에릭 선샤인
의 내용
.git/worktrees/<id>/gitdir
형식의 경로여야 합니다./path/to/worktree/.git
".
다른 콘텐츠는 손상된 "을 나타냅니다.gitdir
철하다작업 트리 자체의 경로를 결정하기 위해 "를 제거할 뿐입니다.
/.git
접미사, 그리고 이것은 실제로 워크트리 경로가 시작부터 결정된 방법입니다.그러나 5193490442("
worktree
작업 트리 세부 정보를 가져오는 기능 추가", 2015-10-08, Gitv2.7.0-rc0 -- merge가 배치 #7에 나열됨) 경로 조작을 신비한 방식으로 확장했습니다.
"를 벗길 수 없는 경우"/.git
경로에서 현재 작업 디렉터리를 연결된 작업 트리의 경로로 보고합니다.if (!strbuf_strip_suffix(&worktree_path, "/.git")) { strbuf_reset(&worktree_path); strbuf_add_absolute_path(&worktree_path, "."); strbuf_strip_suffix(&worktree_path, "/."); }
이 논리는 명백히 거짓입니다. 일반적으로 올바른 행동일 수는 없습니다.그것은 5193490442에서 바람직한 경우를 설명하기 위한 설명도 테스트도 없이 허공에서 구체화되었습니다.
이 논리는 어떻게든 부패한 사람을 다루기 위해 도입되었을 가능성이 있습니다."
gitdir
파일은 의미 있는 값을 반환하지만 현재 작업 디렉터리를 반환하는 것은 유용하지 않습니다.사실, 이것은 상당히 오해의 소지가 있습니다. (현재 디렉토리가 다음과 같은 작업 트리인 경우를 제외하고)gitdir
항목이 손상되었습니다.
또한 손상된 값을 사용자에게 보고하는 것이 문제를 진단하는 데 도움이 될 수 있기 때문에 이 값에 대해 거짓말을 하고 노골적으로 숨기는 것보다 더 유용합니다.그러므로 이 가짜 경로 멍그를 버리고 논리를 단순히 벗겨내는 원래의 행동으로 복원하십시오."
/.git
".
그git
배포에는 다음과 같은 스크립트가 제공됩니다.git-new-workdir
다음과 같이 사용할 수 있습니다.
git-new-workdir project-dir new-workdir branch
여기서 project-interval은 다음을 포함하는 디렉토리의 이름입니다..git
저장소이 스크립트는 다른 스크립트를 생성합니다..git
(현재 분기와 같이) 공유할 수 없는 파일을 제외하고 원래 분기에 대한 많은 심볼릭 링크가 있는 디렉토리를 사용하여 두 개의 서로 다른 분기에서 작업할 수 있습니다.
듣기에는 좀 깨지기 쉽지만, 선택 사항입니다.
저는 여기서 찾지 못한 해결책을 기대하며 이 질문을 접했습니다.그래서 이제 제가 필요한 것을 찾았고, 다른 사람들을 위해 여기에 게시하기로 결정했습니다.
주의: OP 상태와 같이 여러 분기를 동시에 편집해야 하는 경우에는 이 솔루션이 적합하지 않을 수 있습니다.편집할 의도가 없는 여러 분기를 동시에 체크아웃하기 위한 것입니다. (하나의 .git 폴더로 백업되는 여러 작업 디렉터리)
이 질문을 처음 접한 이후로 몇 가지 배운 것이 있습니다.
"빈 저장소"란 무엇입니까?그것은 본질적으로 의 내용입니다.
.git
디렉터리(작업 트리에 위치하지 않음).사용 중인 레포의 위치를 지정할 수 있다는 사실(사용자의 위치)
.git
dir) 명령행에서git
선택--git-dir=
작업 복사본의 위치를 지정할 수 있다는 사실은
--work-tree=
"미러 레포"란 무엇입니까?
마지막은 꽤 중요한 차이입니다.레포 작업을 실제로 하고 싶지는 않습니다. 서로 다른 지점 및/또는 태그의 복사본을 동시에 체크아웃해야 합니다.사실, 저는 그 지점들이 제 리모컨의 지점들과 다르지 않다는 것을 보장해야 합니다.그래서 거울은 저에게 완벽합니다.
사용 사례의 경우 다음과 같은 작업을 수행하여 필요한 것을 참조하십시오.
git clone --mirror <remoteurl> <localgitdir> # Where localgitdir doesn't exist yet
mkdir firstcopy
mkdir secondcopy
git --git-dir=<localgitdir> --work-tree=firstcopy checkout -f branch1
git --git-dir=<localgitdir> --work-tree=secondcopy checkout -f branch2
이것에 대한 큰 경고는 두 복사본에 대한 별도의 HEAD가 없다는 것입니다.그래서 위의 것들 이후에, 달리는 것.git --git-dir=<localgitdir> --work-tree=firstcopy status
HEAD가 branch2를 가리키고 있기 때문에 branch2에서 branch1까지의 모든 차이를 커밋되지 않은 변경 사항으로 표시합니다. (이것이 바로 내가 branch2를 사용하는 이유입니다.)-f
에 대한 선택권.checkout
지역적으로 변경할 계획이 전혀 없기 때문입니다.작업 트리에 대한 태그 또는 분기를 체크아웃할 수 있습니다.-f
옵션).
여러 체크아웃을 편집할 필요 없이 동일한 컴퓨터에 여러 개의 체크아웃이 공존하는 사용 사례에서는 완벽하게 작동합니다.다른 답변에서 다루는 것과 같은 스크립트 없이 여러 작업 트리에 대해 여러 HEAD를 가질 수 있는 방법이 있는지는 모르겠지만, 어쨌든 다른 사람에게 도움이 되었으면 합니다.
제가 생각할 수 있는 유일한 해결책은 두 개의 디렉토리를 복제하여 서로의 원격 저장소로 추가하는 것입니다.그런 다음 실제로 원격 저장소에 아무것도 푸시하지 않고 변경된 저장소에서 다른 저장소로 계속 가져올 수 있습니다.
일부 분기를 원격으로 푸시하지 않기 때문에 원격 복제본이 아닌 두 개의 작업 디렉토리가 필요하다고 가정합니다.그렇지 않으면 원격 복제 두 개가 제대로 작동합니다. 이 세 가지를 모두 동기화하려면 몇 번의 밀고 당기기만 하면 됩니다.
언급URL : https://stackoverflow.com/questions/6270193/how-can-i-have-multiple-working-directories-with-git
'it-source' 카테고리의 다른 글
Oracle 디렉토리 경로를 검색하는 방법은 무엇입니까? (0) | 2023.07.05 |
---|---|
경고: X는 이 기능에서 초기화되지 않은 상태로 사용될 수 있습니다. (0) | 2023.07.05 |
sql developer를 이용한 대용량 데이터 내보내기 방법 - Oracle (0) | 2023.07.05 |
RAISERROR()의 구문 의미는 무엇입니까? (0) | 2023.07.05 |
R의 "던지기"와 동등한 값 (0) | 2023.07.05 |