Git 2.5는 2015 년 7 월부터 contrib/workdir/git-new-workdir
: git worktree
커밋 68a2e6a 참조Junio C ( gitster
)의 를 .
그만큼 릴리스 노트는 언급 :
이를 대체 contrib/workdir/git-new-workdir
하는 것은 상징적 링크에 의존하지 않으며 차용자와 차용자가 서로를 인식하게하여 물건과 심판을 안전하게 공유합니다.
보다 799767cc9 커밋 (힘내 2.5rc2를)
그것은 당신이 지금 할 수 있다는 것을 의미합니다 을git worktree add <path> [<branch>]
창조하다 <path>
및 체크 아웃<branch>
하십시오. 새 작업 디렉토리는 현재 저장소에 링크되어 HEAD, 색인 등과 같은 작업 디렉토리 특정 파일을 제외한 모든 것을 공유 git worktree
합니다.
자식 저장소는 여러 작업 트리를 지원할 수 있습니다 수 있으므로 한 번에 둘 이상의 브랜치를 체크 아웃 할 수 있습니다.
을 사용 git worktree add
하면 새로운 작업 트리가 리포지토리와 연결됩니다.
이 새로운 작업 트리는 "주요 작업 트리"와 달리 "링크 된 작업 트리"라고합니다.git init
"또는 "에 라고합니다.git clone
"로 라고 합니다.
저장소에는 하나의 기본 작업 트리 (빈 저장소가 아닌 경우)와 0 개 이상의 연결된 작업 트리가 있습니다.
세부:
연결된 각 작업 트리에는 저장소 디렉토리에 개인용 하위
$GIT_DIR/worktrees
디렉토리가 있습니다.
개인용 하위 디렉토리의 이름은 일반적으로 연결된 작업 트리 경로의 기본 이름이며 고유하게하기 위해 숫자가 추가 될 수 있습니다.
예를 들어$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 worktree
"BUGS" 섹션을 알고 있어야합니다.
하위 모듈에 대한 지원 이 불완전 합니다.
수퍼 프로젝트를 여러 번 체크 아웃하지 않는 것이 좋습니다.
참고 : git 2.7rc1 (2015 년 11 월)을 사용하면 작업 트리를 나열 할 수 있습니다.
참조 bb9c03b 커밋 , 92718b7 커밋 , 5,193,490 커밋 , 1ceb7f9 커밋 , 1ceb7f9 커밋 , 5,193,490 커밋 , 1ceb7f9 커밋 , 1ceb7f9 커밋 (2015 08 시월) 92718b7 커밋 , 5,193,490 커밋 , 1ceb7f9 커밋 , 1ceb7f9 커밋 (2015 08 시월) 5193490 커밋 , commit 1ceb7f9 (2015 년 10 월 8 일), commit 1ceb7f9 (2015 년 10 월 8 일) 및 ac6c561 커밋(2015 년 10 월 2 일) )마이클 Rappazzo (rappazzo
.
(에 의해 합병 Junio C 하마노 - gitster
- 에 a46dcfb을 투입 , 2015 10월 26일)
worktree
: ' list
'명령 추가
' git worktree list
'는 작업 트리 목록을 반복하고 작업 트리 경로, 현재 체크 아웃 된 개정 및 분기 및 작업 트리가없는 경우를 포함하여 작업 트리의 세부 사항을 출력합니다.
$ git worktree list
/path/to/bare-source (bare)
/path/to/linked-worktree abcd1234 [master]
/path/to/other-linked-worktree 1234abc (detached HEAD)
도자기 형식 옵션도 있습니다.
도자기 형식에는 속성 당 한 줄이 있습니다.
- 속성은 단일 공백으로 구분 된 레이블 및 값과 함께 나열됩니다.
- 부울 속성 (예 : 'bare'및 'detached')은 레이블로만 나열되며 값이 true 인 경우에만 존재합니다.
- 빈 줄은 작업 트리의 끝을 나타냅니다
예를 들어 :
$ 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
참고 : 작업 트리 폴더를 이동하는 경우 수동으로 업데이트 해야 합니다.gitdir
파일 합니다.
참조 618244e 커밋 (2016년 1월 22일을), 및 d4cddd6 커밋 (2016년 1월 18일)에 의해 응웬 타이 응옥 두이 ( pclouds
) .
도움 : Eric Sunshine ( sunshineco
) .
( Junio C gitster
Hamano 에 의해 병합 -- 커밋 d0a1cbc , 2016 년 2 월 10 일)
git 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
"는 다른 작업 트리에서 체크 아웃 된 분기를 삭제할 수 있습니다.
Kazuki Yamaguchi ( )의 커밋 f292244 (2016 년 3 월 29 일)를 참조하십시오 .
도움 : Eric Sunshine ( ) . ( Junio C Hamano 에 의해 합병 -- 커밋 4fca4e3 , 2016 년 4 월 13 일)rhenium
sunshineco
gitster
branch -d
: 현재 체크 아웃 된 브랜치 삭제를 거부합니다.
현재 작업 트리에서 분기를 체크 아웃하면 분기 삭제가 금지됩니다.
그러나 다른 작업 트리에서만 분기를 체크 아웃하면 잘못 삭제됩니다. 현재 작업 트리의 HEAD와 비교하지 않고 분기가
사용 find_shared_symref()
중인지 확인하는 데 사용 합니다.
마찬가지로 git 2.9 (2016 년 6 월) 이전에 다른 작업 트리에서 체크 아웃 된 지점의 이름을 바꾸면 다른 작업 트리의 기호 HEAD가 조정되지 않았습니다.
참조 18eb3a9 커밋 (2016 4월 8일을), 및 70999e9 커밋 , 2,233,066 커밋 에 의해 (2016년 3월 27일) 카즈키 야마구치을 ( rhenium
) .
( Junio C gitster
Hamano 에 의해 합병 - 커밋 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 (Q3 2016)에서 지원됩니다
참조 080739b 커밋 , 6d30862 커밋 , 58142c0 커밋 , 346ef53 커밋 , 346ef53 커밋 , 58142c0 커밋 , 346ef53 커밋 , 346ef53 커밋 (2016 6월 13일), 및 984ad9e 커밋 , 6,835,314 커밋 에 의해 (2016 6월 3일를) 응웬 타이 응옥 두이 ( pclouds
) .
제안 : Eric Sunshine ( sunshineco
) .
(의해 병합 - Junio C 하마노 gitster
- 에 2c608e0 커밋 2,016 28 날짜 : Jul)
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 (Q2 2017 )은 Nguyễn Thái Ngọc Duy ( )의 commit 507e6e9 (2017 년 4 월 12 일)에 lock
옵션 을 추가합니다 .
제안 : David Taylor ( ) .
도움 : Jeff King ( ) . ( Junio C Hamano 에 의해 병합 - 커밋 e311597 , 2017 년 4 월 26 일)pclouds
dt
peff
gitster
작업 트리를 만든 직후에 잠글 수 있습니다.
이렇게하면 " git worktree add; git worktree lock
"와 " git worktree prune
" 간의 경쟁을 방지 할 수 있습니다.
따라서 after git worktree add' --lock
와 동일 하지만 경쟁 조건이 없습니다.git worktree lock
git worktree add
Git 2.17+ (2018 년 2 분기) 추가 git worktree move
/ git worktree remove
: 이 답변보기 .
Git 2.19 (Q3 2018)에 " --quiet
"옵션을 추가하여 " git worktree add
"을 덜 장황하게 만듭니다.
Elia Pinto ( )의 commit 371979c (2018 년 8 월 15 일)를 참조하십시오 .
도움 : Martin Ågren, Duy Nguyen ( ) 및 Eric Sunshine ( ) . ( Junio C Hamano 에 의해 병합 -- 커밋 a988ce9 , 2018 년 8 월 27 일)devzero2000
pclouds
sunshineco
gitster
worktree
: --quiet
옵션 추가
다른 명령 과 마찬가지로 ' --quiet
'옵션을에 추가하십시오 .
' '을 (를) 제외한 다른 모든 명령 은 현재 기본적으로 침묵 하기 때문에 ' '는 영향을받는 유일한 명령 입니다.git worktree
git
add
list
" git worktree add
"는 "stat에 사용 가능한 이름을 찾은 다음 mkdir
", 경쟁하기 쉬운 "을 찾는 데 사용되었습니다 .
이것은 Git 2.22 (Q2 2019)에서 사용 mkdir
하고 반응하여 수정되었습니다.EEXIST
루프에서 .
Michal Suchanek ( )의 commit 7af01f2 (2019 년 2 월 20 일)를 참조하십시오 . ( Junio C Hamano 에 의해 합병 -- 커밋 20fe798 , 2019 년 4 월 9 일)hramrach
gitster
worktree
: 수정 worktree add
레이스
Git은 stat 루프를 실행하여 사용 가능한 작업 트리 이름을 mkdir
찾은 다음 찾은 이름에서 수행합니다. worktree add의 다른 호출이 동일한 무료 이름을 찾고 디렉토리를 먼저 작성하지 않도록
하려면 mkdir
루프로 돌리십시오 .
Git 2.22 (Q2 2019)는 Git 리포지토리에 작업 트리 git branch -D
가 있는지 확인하여 현재 실수로 체크 아웃 한 분기를 " "에서 제거하지 못하도록 보호하는 논리를 수정합니다 .
이 논리의 구현은 특이한 이름을 가진 리포지토리에 대해 깨졌습니다. 불행히도 요즘 하위 모듈의 표준입니다.
Jonathan Tan ( )의 commit f3534c9 (2019 년 4 월 19 일)를 참조하십시오 . ( Junio C Hamano 에 의해 병합 - 커밋 ec2642a , 2019 년 5 월 08 일)jhowtan
gitster
코드 풀 요청 178 통찰력
worktree
: 업데이트 is_bare
휴리스틱
" git branch -D <name>
"가 실행될 때 , Git은 일반적으로 해당 분기가 현재 체크 아웃되어 있는지 먼저 확인합니다.
그러나 해당 리포지토리의 Git 디렉터리가 " <repo>/.git
"에 없으면이 검사가 수행되지 않습니다 super/.git/modules/<repo>
. 예를 들어 해당 리포지토리가 Git 디렉터리가 " " 로 저장된 하위 모듈 인 경우입니다 .
체크 아웃 된 경우에도 분기가 삭제됩니다.
이는 작업 트리 의 경로가 " "로 끝나지 않으면 저장소가없는 "휴리스틱 만 휴리스틱을 사용하여 작업 트리의 세트 에서 발생 하기 때문 get_main_worktree()
입니다 .
이 코드는 휴리스틱 에 따라 92718b7 ( " : 작업 트리 구조에 세부 정보 추가", 2015-10-08, Git v2.7.0-rc0) 에 도입되었습니다 .worktree.c
is_bare
/.git
is_bare
worktree
pre-core.bare
이 패치는 다음 두 가지를 수행합니다.
- 티치가
get_main_worktree()
사용하는 is_bare_repository()
대신에 도입 7d1864c ( "(is_bare_repository 소개) 및 core.bare 구성 변수", 2007-01-07, 힘내 v1.5.0-RC1)을하고 업데이트 e90fdc3 2007 년 ( "청소 작업 트리 처리까지" -08-01, 힘내 v1.5.3-rc4).
이렇게하면 git branch -D <name>
위에서 설명한 " "문제가 해결 됩니다.
그러나 ... 리포지토리에 보조 작업 트리 중 하나에서 core.bare=1
" git
"명령을 실행 하고 있지만 is_bare_repository()
사용 가능한 작업 트리가 있으므로 false를 반환합니다.
또한 기본 워크 트리가 베어 베어가 아닌 경우 처리하면 문제가 발생합니다.
예를 들어, 기본 작업 트리가 비어있는 경우에도 기본 작업 트리의 HEAD가 참조하는 보조 작업 트리에서 분기를 삭제하지 못했습니다.
이를 피하려면 core.bare
설정시 확인하십시오 is_bare
.
이면 core.bare=1
신뢰하고 그렇지 않으면을 사용하십시오 is_bare_repository()
.
git-new-workdir
git checkout --to=<path>
Git 2.5에서 대체 될 것입니다 . 아래 답변을