2011-08-10 4 views
4

나는 여러 디렉토리가있는 큰 프로젝트가 하위 트리으로 있습니다.git 다른 메인 저장소에 하위 디렉토리를 푸시

내가 원하는 특정 하위 트리의 변경 사항을 별도의 저장소 인 해당 원본으로 푸시합니다.

문제가되는 것 같습니다만, 현재는 서브 트리 원래는 리포지터리 (repository)에서 온 것이 아니고, 밀어 넣고 싶습니다. 그것은 다른 repo에서 왔는데, 서브 트리 가이드으로 찾았습니다. 그냥 비슷하게 보입니다.

큰 프로젝트 레이아웃, important_subtree은 내가 걱정하는 것입니다.

~/devel/bigproject 
    .git/ 
    some_subtree/ 
    other_subtree/ 
    important_subtree/ 
    abc.txt 
    efg.txt <--- new version 
    hij.txt 

그리고 important_subtree 그 REPO에 "강하게 관련"되어

~/devel/important 
    .git/ 
    abc.txt 
    efg.txt <--- old version 
    hij.txt 

지금 ~/devel/bigproject/important_subtree/efg.txt 변경하고 나는 REPO ~/devel/important 위에 important_subtree를 밀어 싶다. 그래서 나중에 ~/devel/important/efg.txt도 변경되었습니다.

내가하고 관리하는 유일한 것은 내가 원하는 분명하지 않은, 중요한에 bigproject 에 푸시 모든을 추진하는 것입니다. 하위 트리의 변경 사항 만 밀어 넣어야합니다.

답변

2

이 작업은 더 이상 복잡하지 않습니다. 원하지 않는 하위 디렉토리를 제거하고 새 리모컨으로 푸시하려면 복제본에 git filter-branch 명령을 사용하면됩니다.

git clone <ORIG_REPO_DIR> <NEW_REPO_DIR> 
cd <NEW_REPO_DIR> 
git filter-branch --prune-empty --subdirectory-filter <THE_SUBDIR_TO_MAKE_NEW_ROOTDIR> master 
git push <MY_NEW_REMOTE_ORIGIN_URL> -f . 
+0

매력이 있습니다. 'YOUR_SUBDIR'가 재 작성된 repo의 루트 디렉토리가 될 것임을 언급해야합니다 (정확하게 원하는 것입니다). 또한, 나는'푸시'를 이해하지 못한다 : 내 새로운 원격 URL? 왜 -f (강제)인가? "." 여기서 말하는거야? 나는 네 푸시를 재현 할 수 없었다. 그래서 나는'cd ..; git clone '- 완벽합니다. – towi

+0

푸시는 추출 된 파일을 새 리모컨에 추가하는 것입니다. 편집이 더 명확한가요? – jeremyjjbrown

+0

"the"new remote? 나는 역사가 다시 쓰여졌 기 때문에 다시 작성한 repo를 현재 리모컨으로 푸시 할 수 없다고 말한 것 같습니다. 그래서 새로운 repo (베어, 서버에 무엇이든)를 초기화하고 거기에 재 작성을 푸는 것이 가장 좋습니다. – towi

1

다른 가지로 밀기는 매우 까다로운 일일 수 있습니다.

아마 가장 쉬운 방법은 다음과 같습니다

  1. 복제하여 "중요한"REPO 번 서버에서.
  2. 을 처음으로 밀어 넣으려는 변경 사항을 정확히 포함하는 "bigproject"패치를 생성합니다 (예 : git format-patch) (사이드 브랜치에서 "더 작은"커밋을 먼저 만들어야 할 수도 있습니다. 원래 푸시해야 믹스 파일과 그와 같은 파일을 밀어 넣으십시오.
  3. "중요"새 복제본에 패치를 적용하십시오.
  4. "중요"의 새 복제본을 기본 원격 마스터에 푸시하십시오. . 이제 푸시는 단순한 빠른 진행이며 문제를 일으키지 않아야합니다.
+0

<> 내가 생각한 것. 고맙습니다. – towi

3

나는 git-subtree을 git에 추가하는 것이 좋습니다. 그것은 당신이 원하는 것을 수행하는 git subtree split 명령을 추가합니다.

git subtree split --prefix=important_subtree --branch=backport <subtree merge SHA1>^.. --onto=<imported SHA1> --rejoin 
git push ~/devel/important backport:master 

이 만 important_subtree/을 수정하는 사람들을 복용, 하위 트리로 important 병합 이후 bigproject의 변화를 벚꽃-선택합니다. 그런 다음 ~/devel/important에서 가져온 커밋의 맨 위에 새 커밋으로 적용하고 정상적인 방법으로 다시 밀어 넣을 수있는 분기 backport을 만듭니다. 또한 --rejoin을 사용하면 이후에 커밋 ID를 사용할 필요가 없으므로 더 많은 변경 작업을 반복 할 수 있습니다.

author's blog post에 대한 자세한 설명이 있습니다.

관련 문제