개발관련/Git

한 git 저장소에서 다른 저장소 (복제본 아님)로 파일을 이동하여 기록을 보존하는 방법

Rateye 2021. 11. 29. 00:29
728x90
반응형
질문 : 한 git 저장소에서 다른 저장소 (복제본 아님)로 파일을 이동하여 기록을 보존하는 방법

Git 리포지토리는 개별 프로젝트에 각각 다음과 같은 자체 트리가있는 단일 몬스터 SVN 리포지토리의 일부로 시작되었습니다.

project1/branches
        /tags
        /trunk
project2/branches
        /tags
        /trunk

svn mv 를 사용하여 파일을 다른 파일로 옮기는 것은 꽤 쉬웠습니다. 그러나 Git에서 각 프로젝트는 자체 저장소에 있으며 오늘은 하위 디렉토리를 project2 에서 project1 로 이동하라는 요청을 받았습니다. 나는 다음과 같이했다.

$ git clone project2 
$ cd project2
$ git filter-branch --subdirectory-filter deeply/buried/java/source/directory/A -- --all
$ git remote rm origin  # so I don't accidentally overwrite the repo ;-)
$ mkdir -p deeply/buried/different/java/source/directory/B
$ for f in *.java; do 
>  git mv $f deeply/buried/different/java/source/directory/B
>  done
$ git commit -m "moved files to new subdirectory"
$ cd ..
$
$ git clone project1
$ cd project1
$ git remote add p2 ../project2
$ git fetch p2
$ git branch p2 remotes/p2/master
$ git merge p2 # --allow-unrelated-histories for git 2.9+
$ git remote rm p2
$ git push

그러나 그것은 꽤 복잡해 보입니다. 일반적으로 이런 일을하는 더 좋은 방법이 있습니까? 아니면 올바른 접근 방식을 채택 했습니까?

여기에는 단순히 다른 저장소의 일부에서 새 독립형 저장소를 만드는 것이 아니라 기존 저장소에 기록을 병합하는 것이 포함됩니다 ( 이전 질문에서와 같이 ).

답변

네, filter-branch --subdirectory-filter 를 누르는 것이 핵심이었습니다. 당신이 그것을 사용했다는 사실은 본질적으로 더 쉬운 방법이 없다는 것을 증명합니다. 당신은 파일의 (이름이 바뀐) 부분 집합으로 끝나고 싶었 기 때문에 히스토리를 다시 쓸 수밖에 없었습니다. 그리고 이것은 정의에 의해 해시를 변경합니다. 표준 명령 (예 : pull )이 기록을 다시 작성하지 않기 때문에이를 수행하는 데 사용할 수있는 방법이 없습니다.

물론 세부 사항을 다듬을 수 있습니다. 일부 복제 및 분기가 꼭 필요한 것은 아니지만 전반적인 접근 방식은 좋습니다! 복잡한 일이 아쉽지만 물론 git의 요점은 역사를 쉽게 다시 작성하는 것이 아닙니다.

출처 : https://stackoverflow.com/questions/1365541/how-to-move-files-from-one-git-repo-to-another-not-a-clone-preserving-history
728x90
반응형