GIT : 특정 폴더로 결제


답변:


57

( "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

또한 매뉴얼 페이지에서 :

직관적 인 목표는 여기에 없습니다. 반복성은


도 (자식 1.9.1 테스트)를 --prefix 세트 :-( 맨 손으로 자식 저장소에서 슬프게도이하지 않습니다 작품
apeiros

1
베어 git 저장소의 브랜치 / 커밋을 확인하려면GIT_WORK_TREE=../path/to/place git checkout
allicoder

4
git worktree(아래 참조) imho는 오늘 정식 답변이며 여기에 추가 될 수 있습니다.
괴짜 멀린

213

좀 더 깔끔한 또 다른 솔루션-다른 작업 트리를 지정하십시오.

HEAD (인덱스 아님)에서 특정 출력 디렉토리까지 모든 항목을 체크 아웃하려면 다음을 수행하십시오.

git --work-tree=/path/to/outputdir checkout HEAD -- .

HEAD에서 특정 디렉토리로 서브 디렉토리 또는 파일을 체크 아웃하려면 다음을 수행하십시오.

git --work-tree=/path/to/outputdir checkout HEAD -- subdirname

4
마이너 주 - 당신은 확장 물결표 쉘이 발생하지 않는 한, 즉, 절대 경로를 필요합니까 --work-tree=/home/thomasg/okcopy보다는 --work-tree=~/okcopy(같은 자식 트리 안에 앉아 너무 작동하는 동안 아마도 상대 경로를 사용하지만, 그런 식으로 거짓말 광기와 git statusR'lyehian에서 출력)
Tom Goodfellow

10
이전 커밋에서도 예상대로 작동하지만 (예 : HEAD 대신 SHA 제공) git status많은 모드를 표시합니다 (아마도 색인은 수정되지 않은 일반 작업 트리가 아닌 다른 디렉토리와 일치하기 때문에). git reset다시 좋은 상태로 돌아 왔습니다.
Tom Goodfellow

2
여기 git status에 많은 개조가 표시되며 git reset도움이되지 않습니다. git checkout -f HEAD레포 상태를 복원 해야했습니다 .
DUzun

11
참고 : 직접 디렉토리를 작성해야합니다. 그렇지 않으면이 오류가 발생합니다.fatal: This operation must be run in a work tree
timaschew

13
이것은 주 작업 트리의 색인을 비참하게 수정하는데, 이는 일반적으로 좋지 않습니다. @TomGoodfellow가 제안했듯이 git reset기본 작업 트리를 정상 상태 로 복원하면 충분합니다. 기본 작업 트리 수정 하지 않고 SHA1, 분기 또는 태그에서 저장소 하위 디렉토리를 안전하게 내보내려면 Charles Bailey의 악명 높은 git archive솔루션을 참조하십시오 . 마찬가지로, 여러 지점을 동시에 안전하게 체크 아웃하려면 새 git worktree add부속 명령이 친구입니다.
세실 카레

25

단일 파일의 경우 :

git show HEAD:abspath/to/file > file.copy

2
+1하고 "HEAD 대신에"확실한 이전 커밋 "을 명확히하기 위해 : SHA1 ID를 통해 쉽게 찾을 수 있습니다 gitk. 해당 파일을 임시 위치로 "체크 아웃"해야하는 경우 (예 : 되 showgit show 82e54378856215ef96c5db1ff1160a741b5dcd70:MyProj/proguard/mapping.txt > myproj_mapping.txt
돌리지 않음)

19

위의 솔루션은 특정 태그 버전의 트리를 확인해야했기 때문에 작동하지 않았습니다. 그건 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

3
git --work-tree=/path/to/outputdir checkout <tag> -- .당신을 위해 작동하지 않았다?
warvariuc

1
아닙니다. 원래 작업 디렉토리의 실제 파일은 변경되지 않지만 스테이징 버전은 유실되고 태그의 버전으로 대체됩니다. 준비된 버전에 신중하게 선택된 변경 사항이 포함되어 있으면 특히 나쁩니다. 내보내기 명령이 색인, 기간을 만지는 것을 원하지 않습니다.
proski

19

기능을 수행 중이고 마스터로 다시 체크 아웃하고 싶지 않은 경우 다음을 실행할 수 있습니다.

cd ./myrepo

git worktree add ../myrepo_master master

git worktree remove ../myrepo_master

분기 커밋으로 ../myrepo_master디렉토리를 생성하여 master작업을 계속할 수 있습니다.


1
가장 좋은 대답-간단 git --work-tree=/path/to/outputdir checkout HEAD -- .하고 인덱스에 아무런 영향을 미치지 않는 것과 달리 선택한 분기를 지정된 위치에 복사합니다 (.git 파일 추가).
Roger Dueck

이 변경 사항을 어떻게 취소합니까?
Scott P.

@ ScottP.just myrepo_master디렉토리를 제거
itsnikolay

1
이것을 취소하면 작업 트리의 하위 명령입니다.git worktree remove ../myrepo_master
Martijn Dashorst

8

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.

정리하는 방법에 대한 의견을 +1-다른 모든 사람들은 현재 리포지토리를 엉망으로 만듭니다. 이것 만이 부작용이 없습니다.
앤드류 힐

1

@hasen의 답변에 추가 . checkout 할 파일을 나열하려면 다음 git ls-files대신 사용하십시오 find.

git ls-files -z *.txt | git checkout-index --prefix=/path-to/dest/ -f -z --stdin

올바르게 사용해 주셔서 감사합니다 -z! 특정 종류의 주입 공격에 취약하지 않은 스크립트를 제공하는 것이 좋습니다.
ErikE

0

나는 이것을 달성하기 위해 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"

0

임시 디렉토리에서 분기를 체크 아웃하기 위해이 별칭을 사용하고 있습니다.

[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

새 작업 트리를 추가하기 전에 별칭에서 자동으로 수행됩니다.


0

git archive branch-index | tar -x -C your-folder-on-PC분기를 다른 폴더로 복제하는 데 사용 합니다. 생각하면 필요한 파일을 복사 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.