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
반응형
'개발관련 > Git' 카테고리의 다른 글
로컬 git 브랜치를 원격 브랜치와 비교하는 방법 (0) | 2021.11.29 |
---|---|
git 커밋을 삭제하고 변경 사항을 유지하는 방법 (0) | 2021.11.29 |
모든 Git 태그를 나열하는 방법 (0) | 2021.11.29 |
추적을 중지하고 Git에서 파일 변경 사항을 무시하는 방법 (0) | 2021.11.27 |
한 Git 브랜치에서 다른 Git 브랜치로 단일 파일 버전을 복사하는 방법 (0) | 2021.11.26 |