질문 : 하위 디렉터리를 별도의 Git 저장소로 분리 (이동)
여러 하위 디렉토리가 포함 된 Git 저장소가 있습니다. 이제 하위 디렉터리 중 하나가 다른 하위 디렉터리와 관련이 없으며 별도의 저장소로 분리되어야 함을 발견했습니다.
하위 디렉토리에 파일 기록을 유지하면서 어떻게해야합니까?
나는 클론을 만들고 각 클론의 원치 않는 부분을 제거 할 수있을 것 같지만 이것이 이전 개정판 등을 확인할 때 완전한 트리를 제공 할 것이라고 생각합니다. 이것은 수용 가능할 수도 있지만, 그런 척 할 수있는 것을 선호합니다. 두 저장소에는 공유 기록이 없습니다.
명확하게하기 위해 다음과 같은 구조가 있습니다.
XYZ/
.git/
XY1/
ABC/
XY2/
그러나 대신 이것을 원합니다.
YZ/
.git/
XY1/
XY2/
ABC/
.git/
ABC/
답변
업데이트 :이 프로세스는 매우 일반적이어서 git 팀은 새로운 도구 인 git subtree
사용하여 훨씬 더 간단하게 만들었습니다. 여기 참조 : 하위 디렉터리를 별도의 Git 저장소로 분리 (이동)
저장소를 복제 한 다음 git filter-branch
를 사용하여 새 저장소에서 가비지 수집 할 하위 디렉토리를 제외한 모든 항목을 표시합니다.
- 로컬 저장소를 복제하려면 :
(참고 : 저장소는 하드 링크를 사용하여 복제되지만 하드 링크 된 파일은 자체적으로 수정되지 않고 새 파일이 생성되므로 문제가되지 않습니다.)git clone /XYZ /ABC
- 이제 다시 작성하고 싶은 흥미로운 브랜치를 보존하고, 거기에 밀리지 않도록 오리진을 제거하고 오리진이 오래된 커밋을 참조하지 않도록합니다.
또는 모든 원격 지점의 경우 :cd /ABC for i in branch1 br2 br3; do git branch -t $i origin/$i; done git remote rm origin
cd /ABC for i in $(git branch -r | sed "s/.*origin\///"); do git branch -t $i origin/$i; done git remote rm origin
- 이제 하위 프로젝트와 관련이없는 태그도 제거 할 수 있습니다. 나중에 할 수도 있지만 저장소를 다시 정리해야 할 수도 있습니다. 그렇게하지 않았고
WARNING: Ref 'refs/tags/v0.1' is unchanged
모든 태그에 대해 변경되지 않았습니다 (모두 하위 프로젝트와 관련이 없기 때문에). 또한 이러한 태그를 제거한 후 더 많은 공간이 확보됩니다. 분명히git filter-branch
는 다른 태그를 다시 쓸 수 있어야하지만 이것을 확인할 수는 없습니다. 모든 태그를 제거하려면git tag -l | xargs git tag -d
. - 그런 다음 filter-branch 및 reset을 사용하여 다른 파일을 제외하면 정리할 수 있습니다.
--tag-name-filter cat --prune-empty
를 추가하여 빈 커밋을 제거하고 태그를 다시 작성해 보겠습니다 (서명을 제거해야 함).
또는 또는 HEAD 분기 만 다시 작성하고 태그 및 기타 분기를 무시하려면 :git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC -- --all
git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC HEAD
- 그런 다음 백업 리플 로그를 삭제하여 공간을 실제로 회수 할 수 있습니다 (이제 작업이 파괴적 임에도 불구하고).
이제 모든 히스토리가 보존 된 ABC 하위 디렉토리의 로컬 git 저장소가 있습니다.git reset --hard git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d git reflog expire --expire=now --all git gc --aggressive --prune=now
참고 : 대부분의 경우 git filter-branch
에는 실제로 추가 된 매개 변수 -- --all
이 있어야합니다. 예 그건 정말
--space--
all
. 이것은 명령의 마지막 매개 변수 여야합니다. Matli가 발견했듯이 이것은 새 저장소에 포함 된 프로젝트 분기와 태그를 유지합니다.
편집 : 예를 들어 저장소가 실제로 축소되었는지 확인하기 위해 아래 주석의 다양한 제안이 통합되었습니다 (이전에는 항상 그런 것은 아님).
출처 : https://stackoverflow.com/questions/359424/detach-move-subdirectory-into-separate-git-repository
'개발관련 > Git' 카테고리의 다른 글
Git으로 분기점 찾는 방법 (0) | 2021.11.24 |
---|---|
깃허브가 마크다운을 괴롭히다 - 666을 DCLXVI로 변경 (0) | 2021.11.23 |
git 표시를 삭제하고 새 파일을 파일 이동으로 표시하는 방법 (0) | 2021.11.23 |
Git에서 "origin"에 대한 설명 (0) | 2021.11.23 |
git-merge --dry-run 옵션 (0) | 2021.11.23 |