답변:
당 ( "SVN 수출"와 같은)는 "자식 수출"합니까?
사용할 수 있습니다 git checkout-index. 이것은 저수준 명령입니다. 모든 것을 내보내려면을 사용할 수 있습니다 -a.
git checkout-index -a -f --prefix=/destination/path/
매뉴얼 페이지를 인용하려면 :
접두사에서 마지막 "/"가 중요합니다. 내 보낸 이름은 문자 그대로 지정된 문자열로 시작합니다.
특정 디렉토리를 내보내려면 몇 가지 트릭이 필요합니다. 이 명령은 디렉토리가 아닌 파일 만 가져옵니다. 디렉토리에 적용하려면 'find'명령을 사용하고 출력을 git으로 파이프하십시오.
find dirname -print0 | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
또한 매뉴얼 페이지에서 :
직관적 인 목표는 여기에 없습니다. 반복성은
GIT_WORK_TREE=../path/to/place git checkout
git worktree(아래 참조) imho는 오늘 정식 답변이며 여기에 추가 될 수 있습니다.
좀 더 깔끔한 또 다른 솔루션-다른 작업 트리를 지정하십시오.
HEAD (인덱스 아님)에서 특정 출력 디렉토리까지 모든 항목을 체크 아웃하려면 다음을 수행하십시오.
git --work-tree=/path/to/outputdir checkout HEAD -- .
HEAD에서 특정 디렉토리로 서브 디렉토리 또는 파일을 체크 아웃하려면 다음을 수행하십시오.
git --work-tree=/path/to/outputdir checkout HEAD -- subdirname
--work-tree=/home/thomasg/okcopy보다는 --work-tree=~/okcopy(같은 자식 트리 안에 앉아 너무 작동하는 동안 아마도 상대 경로를 사용하지만, 그런 식으로 거짓말 광기와 git statusR'lyehian에서 출력)
git status많은 모드를 표시합니다 (아마도 색인은 수정되지 않은 일반 작업 트리가 아닌 다른 디렉토리와 일치하기 때문에). git reset다시 좋은 상태로 돌아 왔습니다.
git status에 많은 개조가 표시되며 git reset도움이되지 않습니다. git checkout -f HEAD레포 상태를 복원 해야했습니다 .
fatal: This operation must be run in a work tree
git reset기본 작업 트리를 정상 상태 로 복원하면 충분합니다. 기본 작업 트리 를 수정 하지 않고 SHA1, 분기 또는 태그에서 저장소 하위 디렉토리를 안전하게 내보내려면 Charles Bailey의 악명 높은 git archive솔루션을 참조하십시오 . 마찬가지로, 여러 지점을 동시에 안전하게 체크 아웃하려면 새 git worktree add부속 명령이 친구입니다.
위의 솔루션은 특정 태그 버전의 트리를 확인해야했기 때문에 작동하지 않았습니다. 그건 cvs export그렇고, 그것이 사용되는 방법입니다. git checkout-index인덱스에서 파일을 체크 아웃하므로 태그 인수를 사용하지 않습니다. git checkout <tag>작업 트리에 관계없이 색인을 변경하므로 원래 트리를 재설정해야합니다. 나를 위해 일한 해결책은 저장소를 복제하는 것이 었습니다. 공유 클론은 매우 빠르며 추가 공간을 많이 차지하지 않습니다. .git원하는 경우 디렉토리는 제거 할 수 있습니다.
git clone --shared --no-checkout <repository> <destination>
cd <destination>
git checkout <tag>
rm -rf .git
최신 버전의 git은 git clone --branch <tag>지정된 태그를 자동으로 체크 아웃하도록 지원해야합니다 .
git clone --shared --branch <tag> <repository> <destination>
rm -rf <destination>/.git
git --work-tree=/path/to/outputdir checkout <tag> -- .당신을 위해 작동하지 않았다?
기능을 수행 중이고 마스터로 다시 체크 아웃하고 싶지 않은 경우 다음을 실행할 수 있습니다.
cd ./myrepo
git worktree add ../myrepo_master master
git worktree remove ../myrepo_master
분기 커밋으로 ../myrepo_master디렉토리를 생성하여 master작업을 계속할 수 있습니다.
git --work-tree=/path/to/outputdir checkout HEAD -- .하고 인덱스에 아무런 영향을 미치지 않는 것과 달리 선택한 분기를 지정된 위치에 복사합니다 (.git 파일 추가).
myrepo_master디렉토리를 제거
git worktree remove ../myrepo_master
Adrian의 답변은 "치명적 :이 작업은 작업 트리에서 실행해야합니다." 다음은 우리를 위해 일한 것입니다.
git worktree add <new-dir> --no-checkout --detach
cd <new-dir>
git checkout <some-ref> -- <existing-dir>
노트:
--no-checkout 새 작업 트리에 아무것도 체크 아웃하지 마십시오.--detach 새 작업 트리에 대한 새 분기를 작성하지 마십시오.<some-ref>예를 들어와 함께 작동하는 모든 참조와 함께 작동합니다 HEAD~1.git worktree prune.@hasen의 답변에 추가 . checkout 할 파일을 나열하려면 다음 git ls-files대신 사용하십시오 find.
git ls-files -z *.txt | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
-z! 특정 종류의 주입 공격에 취약하지 않은 스크립트를 제공하는 것이 좋습니다.
나는 이것을 달성하기 위해 git alias를 정의했다 (이 질문을 발견하기 전에).
현재 경로를 저장하고 git repo로 전환하고 체크 아웃하고 시작한 곳으로 돌아 오는 짧은 bash 기능입니다.
git checkto 개발 ~ / my_project_git
예를 들어 개발 브랜치를 "~ / my_project_git"디렉토리로 체크 아웃합니다.
이것은 내부의 별칭 코드입니다 ~/.gitconfig.
[alias]
checkTo = "!f(){ [ -z \"$1\" ] && echo \"Need to specify branch.\" && \
exit 1; [ -z \"$2\" ] && echo \"Need to specify target\
dir\" && exit 2; cDir=\"$(pwd)\"; cd \"$2\"; \
git checkout \"$1\"; cd \"$cDir\"; };f"
임시 디렉토리에서 분기를 체크 아웃하기 위해이 별칭을 사용하고 있습니다.
[alias]
cot = "!TEMP=$(mktemp -d); f() { git worktree prune && git worktree add $TEMP $1 && zsh -c \"cd $TEMP; zsh\";}; f" # checkout branch in temporary directory
용법:
git cot mybranch
그런 다음 지점에서 작업 할 수있는 임시 디렉토리의 새 쉘에 놓입니다. 이 디렉토리에서 git 명령을 사용할 수도 있습니다.
완료되면 디렉토리를 삭제하고 다음을 실행하십시오.
git worktree prune
새 작업 트리를 추가하기 전에 별칭에서 자동으로 수행됩니다.