programing tip

Git 1.7.0의 스파 스 체크 아웃?

itbloger 2020. 11. 9. 07:53
반응형

Git 1.7.0의 스파 스 체크 아웃?


Git 1.7.0 의 새로운 스파 스 체크 아웃 기능사용하면 SVN에서와 같이 하위 디렉토리의 콘텐츠를 가져올 수 있습니까? 이 예제를 찾았 지만 전체 디렉토리 구조를 유지합니다. 'perl'이라는 실제 디렉토리없이 'perl'디렉토리의 내용을 원한다고 상상해보십시오.

-- 편집하다 --

예:

내 자식 저장소에는 다음 경로가 포함되어 있습니다.

repo/.git/
repo/perl/
repo/perl/script1.pl
repo/perl/script2.pl
repo/images/
repo/images/image1.jpg
repo/images/image2.jpg
repo/doc/
repo/doc/readme.txt
repo/doc/help.txt

내가 원하는 것은 위의 저장소에서이 레이아웃을 생성 할 수있는 것입니다.

repo/.git/
repo/script1.pl
repo/script2.pl

그러나 현재의 스파 스 체크 아웃 기능을 사용하면

repo/.git/
repo/perl/script1.pl
repo/perl/script2.pl

내가 원하는 것이 아닙니다.


여전히 모든 파일이있는 전체 저장소를 복제해야합니다. --depth제한된 양의 기록 만 검색하는 플래그를 사용할 수 있습니다 .

저장소가 복제되면 읽기 트리 트릭은 저장소의 "보기"를 파일에있는 파일 또는 디렉토리로만 제한합니다 .git/info/sparse-checkout.

나는 희박함을 관리하는 데 도움이되는 빠른 스크립트를 작성했습니다.

#!/bin/sh
echo > .git/info/sparse-checkout
for i in "$@"
do
    echo "$i" >> .git/info/sparse-checkout
done
git read-tree -m -u HEAD

당신이로이 스크립트를 저장하면 git-sparse.sh경로로 호출하여보고 git --exec-path, 당신은 실행할 수 있습니다 git sparse foo/ bar/foo는 바 디렉토리 전용 "체크 아웃"을, 또는 git sparse '*'다시 모든 것을 얻을 수 있습니다.


짧은 대답은 아니오입니다. Git은 모든 파일을 단일 단위로 간주합니다.

내가 추천하는 것은 리포지토리를 논리적 청크로 분해하는 것입니다. perl, 이미지 및 문서에 대한 별도의 것. uber repo 스타일을 유지 해야하는 경우 Submodules 로 구성된 repo를 만들 수 있습니다 .


richq의 대답은 가까웠지만 한 걸음을 놓쳤습니다. 스파 스 체크 아웃을 명시 적으로 활성화해야합니다.

git config core.sparsecheckout true

이 블로그 게시물에는 모든 단계가 명확하게 설명되어 있습니다.

http://blog.quilitz.de/2010/03/checkout-sub-directories-in-git-sparse-checkouts/comment-page-1/#comment-3146


이제이 작업을 수행하려는 이유에 대해 자세히 설명하지 않아도 심볼릭 링크 / 바로 가기로 문제를 (아마도) 쉽게 해결할 수 있습니다.

질문에 답하기 위해-아니요, 의미있는 이유가 있습니다. 저장소의 전체 기록은 '희소 체크 아웃'으로도 다운로드됩니다. 이것이 필요한 이유를 명확히하기 위해-그렇지 않으면 이름이 변경된 파일을 추적하는 것이 ... 목에 고통 스러울 것입니다. 파일을 이동 상상 /repo_root/asd/file1.cpp/repo_root/fgh/file1.cpp- 만 다운로드 더라면 지금 /repo_root/fgh델타를, 당신이 file1.cpp에 대해 알 수 없습니다. 따라서 모든 델타를 다운로드해야합니다. 그러나 그러면 전체 저장소가 있습니다. 폴더 컷 /rero_root/fgh이 아니므로 폴더 자체가 저장소가 아닙니다. 이것은 체크 아웃 할 때 중요하게 들리지 않을 수 있지만 커밋 할 때 git은 제대로 작동 할만큼 충분히 알지 못할 수 있습니다.

해결 방법 : 정말로 원한다면 다음과 같은 방식으로 git-checkout을 호출하는 스크립트를 만들 수 있습니다 (sh 셸의 경우 Windows 용 일괄 처리는 생성하기 어렵지 않아야 함).

!/bin/sh
curDir=`pwd`
cd $2
git-checkout $1
cp -R $3/* $4
cd $curDir

여기에서 첫 번째 인수는 체크 아웃 할 분기이고, 두 번째는 저장소가 현재 존재하는 폴더, 세 번째는 실제로 사용하려는 하위 디렉터리, 네 번째는 복사 할 위치입니다.

경고 : 내 셸 스킬은 거의 존재하지 않으므로 테스트 후 사용하십시오. 리포지토리에 커밋 할 수 있도록 내용을 다시 복사하는이 스크립트의 반대를 다시 만드는 것은 어렵지 않습니다.


git filter-branch --subdirectory-filter필요한 것 입니다. 하위 디렉터리를 별도의 Git 저장소로 분리 (이동)를 참조하세요 .

이를 수행하는 작은 bash 스크립트가 있습니다.

This will first make a working copy of the original repo, then filter branch using subdirectory filter to you get what you want.

#!/bin/bash
#
# git-subdir.sh
#
git clone --no-hardlinks $1 $2

cd $2

git filter-branch --subdirectory-filter $2 --prune-empty --tag-name-filter cat HEAD -- --all

git reset --hard

git remote rm origin

refbak=$(git for-each-ref --format="%(refname)" refs/original/)

if [ -n "$refbak" ];then
    echo -n $refbak | xargs -n 1 git update-ref -d
fi

git reflog expire --expire=now --all

git repack -ad

git gc --aggressive --prune=now

Use for the example in the question, git-subdir.sh repo perl would work.


You can try braid - it tracks remotes while matching them to a path. https://github.com/evilchelu/braid/wiki


It appears what you are trying to do is rename the directory tree such that your files end up in a different place. It appears to me that what you are asking to do is an anti-template for code/project management on two counts: categorization of modules (java bits under java node, perl under perl node), and having a project with files in different locations from where the developer visualizes them. Since git maintains hashes of directory contents to see what is changed, this also breaks git as such.

Daemeon Reiydelle

참고URL : https://stackoverflow.com/questions/2336580/sparse-checkout-in-git-1-7-0

반응형