개발관련/Git

하위 디렉터리를 별도의 Git 저장소로 분리하는 방법

Rateye 2021. 11. 23. 10:23
728x90
반응형
질문 : 하위 디렉터리를 별도의 Git 저장소로 분리 (이동)

여러 하위 디렉토리가 포함 된 Git 저장소가 있습니다. 이제 하위 디렉터리 중 하나가 다른 하위 디렉터리와 관련이 없으며 별도의 저장소로 분리되어야 함을 발견했습니다.

하위 디렉토리에 파일 기록을 유지하면서 어떻게해야합니까?

나는 클론을 만들고 각 클론의 원치 않는 부분을 제거 할 수있을 것 같지만 이것이 이전 개정판 등을 확인할 때 완전한 트리를 제공 할 것이라고 생각합니다. 이것은 수용 가능할 수도 있지만, 그런 척 할 수있는 것을 선호합니다. 두 저장소에는 공유 기록이 없습니다.

명확하게하기 위해 다음과 같은 구조가 있습니다.

XYZ/
    .git/
    XY1/
    ABC/
    XY2/

그러나 대신 이것을 원합니다.

YZ/
    .git/
    XY1/
    XY2/
ABC/
    .git/
    ABC/
답변

업데이트 :이 프로세스는 매우 일반적이어서 git 팀은 새로운 도구 인 git subtree 사용하여 훨씬 더 간단하게 만들었습니다. 여기 참조 : 하위 디렉터리를 별도의 Git 저장소로 분리 (이동)

저장소를 복제 한 다음 git filter-branch 를 사용하여 새 저장소에서 가비지 수집 할 하위 디렉토리를 제외한 모든 항목을 표시합니다.

  1. 로컬 저장소를 복제하려면 :
    git clone /XYZ /ABC
    (참고 : 저장소는 하드 링크를 사용하여 복제되지만 하드 링크 된 파일은 자체적으로 수정되지 않고 새 파일이 생성되므로 문제가되지 않습니다.)
  2. 이제 다시 작성하고 싶은 흥미로운 브랜치를 보존하고, 거기에 밀리지 않도록 오리진을 제거하고 오리진이 오래된 커밋을 참조하지 않도록합니다.
    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
  3. 이제 하위 프로젝트와 관련이없는 태그도 제거 할 수 있습니다. 나중에 할 수도 있지만 저장소를 다시 정리해야 할 수도 있습니다. 그렇게하지 않았고 WARNING: Ref 'refs/tags/v0.1' is unchanged 모든 태그에 대해 변경되지 않았습니다 (모두 하위 프로젝트와 관련이 없기 때문에). 또한 이러한 태그를 제거한 후 더 많은 공간이 확보됩니다. 분명히 git filter-branch 는 다른 태그를 다시 쓸 수 있어야하지만 이것을 확인할 수는 없습니다. 모든 태그를 제거하려면 git tag -l | xargs git tag -d .
  4. 그런 다음 filter-branch 및 reset을 사용하여 다른 파일을 제외하면 정리할 수 있습니다. --tag-name-filter cat --prune-empty 를 추가하여 빈 커밋을 제거하고 태그를 다시 작성해 보겠습니다 (서명을 제거해야 함).
    git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC -- --all
    또는 또는 HEAD 분기 만 다시 작성하고 태그 및 기타 분기를 무시하려면 :
    git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC HEAD
  5. 그런 다음 백업 리플 로그를 삭제하여 공간을 실제로 회수 할 수 있습니다 (이제 작업이 파괴적 임에도 불구하고).
    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
    이제 모든 히스토리가 보존 된 ABC 하위 디렉토리의 로컬 git 저장소가 있습니다.

 

 

참고 : 대부분의 경우 git filter-branch 에는 실제로 추가 된 매개 변수 -- --all 이 있어야합니다. 예 그건 정말

--space--

all . 이것은 명령의 마지막 매개 변수 여야합니다. Matli가 발견했듯이 이것은 새 저장소에 포함 된 프로젝트 분기와 태그를 유지합니다.

편집 : 예를 들어 저장소가 실제로 축소되었는지 확인하기 위해 아래 주석의 다양한 제안이 통합되었습니다 (이전에는 항상 그런 것은 아님).

출처 : https://stackoverflow.com/questions/359424/detach-move-subdirectory-into-separate-git-repository
728x90
반응형