code

공통 서브 모듈 (마스터 브랜치)에 대한 Git 커밋

codestyles 2020. 12. 31. 08:18
반응형

공통 서브 모듈 (마스터 브랜치)에 대한 Git 커밋


나는 두 개 이상의 프로젝트 ( ProjectFooProjectBar 라고 부름 ) 하위 모듈에 넣은 공통 코드있습니다.

내 이해는 ProjectFoo 내에서 하위 모듈에 변경 사항을 커밋하면 모든 ProjectFoo 복제본 만 볼 수있는 분리 된 헤드에있을 것입니다 .

(master) $ cd ProjectFooBarCommoneSubmodule/
(master) $ git commit -am "Common code fix."
(56f21fb0...) $ git push
Everything up-to-date

master지점이 변경되지 않았기 때문일 것입니다 . 나는 아마 같은 것을 할 수 git checkout master && git merge Everything up-to-date있지만 그것은 꽤 추한 것 같습니다. git reset --hard master똑같은 일을 할 수도 있지만 더 추한 것 같습니다.

프로젝트에서 공통 코드를 공유하고 이를 사용하는 프로젝트 에서 업데이트하는 방법 무엇입니까? 즉, 해당 하위 모듈에 커밋 하면 동일한 하위 모듈을 사용하는 모든 다양한 저장소 ( 복제본뿐만 아니라 저장소)를 모두 업데이트해야합니다 .

---- 편집하다 ----

내 체크 아웃 된 저장소가 엉망이되어 망가진 것 같습니다. 처음부터 제대로 작동 했어야합니다 ( 이 예제의 ProjectFoo 에서).

(master) $ cd ProjectFooBarCommoneSubmodule/
(master) $ git commit -am "Common code fix."
(master) $ git push
....
   fbfdd71..0acce63  master -> master
(master) $ cd ..
(master) $ git add ProjectFooBarCommoneSubmodule
(master) $ git commit -m "Submodule update."

그런 다음 같은 다른 프로젝트에에서 그 변화를 얻을 수 ProjectBar를 :

(master) $ cd ProjectFooBarCommoneSubmodule/
(master) $ git pull

최신 공통 코드로 업데이트됩니다. git checkout master분리 된 머리에있는 경우 A 가 필요할 수 있습니다.


짧은 대답:

cd ProjectFooBarCommoneSubmodule
git checkout master
<Do your editing>
git commit --all -m "Lots of fixes"
git push submodule_origin master
cd ..

git add ProjectFooBarCommoneSubmodule
git commit -m "Bumped up the revision of ProjectFooBarCommoneSubmodule"
git push origin master

더 긴 것 :

Git 하위 모듈은 종속 메커니즘으로, 메인 프로젝트 (예 : A)가 프로젝트 A를 빌드하는 데 사용될 하위 프로젝트 (예 : B)에 지정된 개정을 정의합니다. 도구가 유용하려면 동작을 예측할 수 있어야합니다. A :의 관점에서. 누군가가 프로젝트 A에 변경 사항을 통합하기로 결정하지 않는 한 종속성은 변경 될 수 없습니다. 모든 종류의 불쾌한 일이 발생할 수 있습니다. 프로젝트 B :의 변경 사항을 자동으로 가져 오면 A가 즉시 실패를 알 수 있으므로 컴파일 오류가 아마도 가장 좋은 것입니다. 이것이 B :의 머리가 분리 된 상태로 유지되는 이유입니다.

B의 상태는 A (체크 아웃 git submodule status)에 저장되며 , 변경 사항이 적용 되려면 A에서 수정 변경이 수행되고 커밋되어야합니다. 위의 예에서 A가 리포지토리에 저장된 개정 번호를 변경하고 버전을 최신 버전으로 올립니다. 이 프로세스는 다른 메인 저장소에서도 반복되어야하므로 자동 "마스터 사용"스위치 AFAIK가 없습니다.

BTW. 서브 모듈에 힘내 책 장서브 모듈 매뉴얼 페이지 정상적인 사용으로 서브 모듈에 대한 유용한 정보를 많이, 전형적인 함정도 포함되어 있습니다. 체크 아웃 할 가치가 있습니다.


편집 : 나는 이것을 더 잘 설명하려고 노력할 것이다

내 github 계정 에 예제 프로젝트를 자유롭게 만들 수 있었습니다. 커밋은 무의미하고 정크를 포함하지만 설정은 괜찮습니다. 다음을 확인하십시오.

ProjectFoo와 ProjectBar는 모두 공통 하위 모듈의 코드를 공유합니다.

ProjectFooBarCommoneSubmodule : master는 6850e4e4c1fac49de398입니다.

ProjectFoo에서 :

git submodule status

-6850e4e4c1fac49de39890703f21486ca04b87a0 공통

ProjectBar에서 :

git submodule status

-6850e4e4c1fac49de39890703f21486ca04b87a0 공통

그래서 둘 다 같은 개정판을 가리 키죠? 여기서 트릭은 ProjectFoo와 ProjectBar 가 브랜치 (마스터)가 아닌 개정판 (6850e4e4c1fac49de39890703f21486ca04b87a0)을 가리키는 것입니다. 첫 번째는 분리 된 머리이고 다른 하나는 명명 된 가지입니다.

ProjectFooBarCommoneSubmodule에서 일부 수정을 수행하려면 ProjectFoo의 하위 디렉토리로 이동 하여 개정 대신 분기를 선택할 수 있습니다 .

git checkout master 
<Do your coding and pushing here>

그런 다음 한 디렉토리 위로 이동하여 git 하위 모듈 상태를 확인하십시오. 이제 동기화 상태가 아님을 알려줍니다.

git submodule status

+ e24bd2bf45d52171a63b67ac05cd4be0ac965f60 공통 (헤드 / 마스터 -1-ge24bd2b)

이제 git add를 수행하여이 특정 커밋 (ge24bd ...)에 대한 참조를 설정하고 커밋을 수행 한 다음 하위 모듈 참조가이 개정판을 가리키며, 이는 ProjectFooBarCommoneSubmodule에서도 마스터가됩니다.

이제 ProjectBar에서도 참조를 업데이트해야합니다. ProjectBar / common으로 이동하여 git fetch origin (빨리 감기 병합)을 수행합니다.

git checkout master 
cd ..
git add common
git commit -m "Bumped up the revision"
git push origin master # to publish the revision bump to everybody else

So, as with any git repository, you don't need to work on a detached head. You can either work on master, or create a named branch. Either way, make sure that upstream contains the ProjectFooBarCommoneSubmodule changes, or you will break both ProjectFoo and ProjectBar, if they reference something that doesn't exist. Hope this explained it better


On the submodule: git push origin HEAD:master


To merge changed from detached HEAD into master, run:

git rebase HEAD master

then checkout master (use -f for force):

git checkout master

If you've got multiple submodules to deal with, use: git submodule foreach, e.g.

git submodule foreach git pull origin master -r

I just do:

git submodule foreach git push -u origin master


Notice:

git submodule foreach 'git commit -a'

will fail if one of the submodules containt no commit to do.

To get rid of this, you have to force the command result to 0.

git submodule foreach "git commit -am 'your comment' || echo ' '"

By using the echo piped you force the whole command to return with 0 and continue executing the commit command on the other submodules


If you want to commit and push all submodules at once do:

git submodule foreach 'git commit -a' ;
git submodule foreach 'git push --all' ;
git commit -a && \
git push --all --recurse-submodules=on-demand

ReferenceURL : https://stackoverflow.com/questions/3590400/git-commit-to-common-submodule-master-branch

반응형