2012-10-09 3 views
8

저는 Avery Pennarun의 git-subtree를 사용하고 있습니다. 현재 나의 자식 repo에서 나는 물론 내 모든 프로젝트 파일/폴더와 서브 트리 "lib"라고 있습니다. git clone을 사용하여이 자식 repo를 복제하면 모든 프로젝트 파일과 서브 트리 "lib"(모든 것이 있어야 함)가 나타납니다. 지금 시도한 내용 : 복제 된 저장소에서 하위 트리 "lib"내의 내용을 변경하고 git subtree push을 사용하여 하위 트리 "lib"의 원격 저장소로 변경 사항을 다시 푸시하려했지만 작동하지 않았습니다. 문제가 무엇입니까? git subtree add를 사용하여 하위 트리로 먼저 을 추가해야합니까? 사전에git-subtree : 복제 된 Repo에서 변경 사항을 푸시

들으

+0

최상위 프로젝트에 하위 트리를 어떻게 추가 했습니까? 디렉토리를 만들고 복제 했습니까? –

+0

안녕하세요! "git subtree add"를 사용하여 최상위 프로젝트에 하위 트리를 추가했습니다. 어쩌면 나의 질문이 충분히 명확하지 않을 수 있습니다. 다른 컴퓨터에서 repo를 복제하면 모든 프로젝트 파일과 하위 트리 "lib"가 생깁니다. 이제 복제 된 저장소에서 하위 트리 "lib"내에서 뭔가를 변경합니다. "git subtree push"를 사용하여 원격 서버로 변경 사항을 다시 푸시 할 수 없습니다. 이것이 내 문제입니다. – arge

+0

답변이 도움이 되었습니까? –

답변

14

부인, 내가 당신이 당신이 추출 하위 트리 충분한 정보를 제공하지 않는 git subtree push를 사용하는 경우

:-) 하위 트리에 대한 learing 며칠 앞으로 당신의 생각 용의자 변경 사항을 적용하십시오.

리포를 올바르게 복제 한 경우 하위 트리가 이미 있습니다. 하위 트리에 푸시 할 하위 트리가 있는지 (심지어 하나만 가지고있을지라도) 알려야하며 푸시 할 위치를 알아야합니다. 특히 최상위 수준의 레포로 푸시하지 않으려 고합니다. 따라서 다음과 같은 것을 원합니다.

git subtree push --prefix=lib [email protected]:arges-github/lib.git master 

분명히 repo와 refspec은 repo와 일치하도록 변경해야합니다.

여기에서 무슨 일이 일어나고 있는지 (그리고 도움이되는지) 살펴 보려면 하위 트리 내의 파일에 영향을주는 변경 사항을 실제로 다른 분기로 분할 한 다음 하위 트리 repo로 푸시합니다. ,

git checkout lib-changes 

이 아닌 경우 수동으로

git push [email protected]:arges-github/lib.git master 

그들을 밀어 : subtree split

git subtree split --rejoin --branch=shared-changes --prefix=lib 

를 사용하여 이런 일이 보는 것은 당신이 만든 분기를 보라 그런 다음 하위 트리를 리포에 병합하지 않았을 수 있습니다. 당신이 하위 트리를 추가 할 때 :

git subtree add --squash --prefix lib [email protected]:arges-github/lib.git master 

당신은 또한 하위 트리를 병합하여 최고 수준의 repo에 다시 밀어해야합니다.

+0

"추가"까지 단계를 실행했습니다. 후속 "당기기"가 필요하다는 어떠한 문서도 찾지 못했습니다. 최초의 "끌어 오기"가 "추가"후에 하위 트리에서 수행되지 않으면 어떻게됩니까? 내가 직면하고있는 문제는 - 스쿼시를 "추가"한 후에도 "하위 트리 푸시"를 시도 할 때 해당 하위 트리에 대한 모든 커밋을 시간의 시작부터 검사하기 시작합니다. 그 하위 트리가 컨테이너 repo에 "추가"된 후입니다. – Nishith

1

나는 정확히 같은 문제가 있었는데 근본적으로 Roger Nolan이 제안한 방법을 사용하여 해결했습니다. 그러나 필자가 생각한 것처럼 대소 문자를 구별하지 않는 파일 시스템을 사용하는 것이 불충분하다면, 당길 때마다 밀어 넣기를 할 때마다 접두사의 대소 문자도 동일하게 유지해야합니다.

실수로 케이스를 뒤섞어 버리면 git은 두 개의 하위 트리가 있다고 생각하지만 파일 시스템에는 하나만 존재합니다.

그래서 내가 (경우에 누구를 도움)와 결국 해결책은 다음과 같습니다

  1. 이 하위 트리를 밀어하는 스크립트를 작성합니다. 전화 번호는 publish_<your-subtree-name>입니다.
  2. 하위 트리를 가져올 다른 스크립트를 만듭니다. update_<your-subtree-name>으로 전화하십시오.
  3. HEAD에 임시 분기를 만들고 업데이트를 테스트하십시오. 스크립트가 맞으면 임시 분기가 이동하지 않습니다.
  4. 다른 곳에서 하위 트리를 복제하고 테스트 커밋을 추가 한 다음 밀어 넣고 방금 작성한 업데이트 스크립트를 사용하여 레포로 가져 오십시오.
  5. 모두 작동하는 경우 임시 분기를 삭제하고 두 스크립트를 모두 수퍼 프로젝트 저장소에 체크인하십시오.
  6. 그런 다음 하위 트리를 밀거나 당길 때마다 스크립트를 사용하십시오.

PS> repsitories의 다른 분기가 하위 트리의 다른 분기를 가져 오는 경우와 프로젝트에 여러 하위 트리가있는 경우 특히 --squash 매개 변수가 중요합니다.

관련 문제