2017-09-13 6 views
3

나는 항상 하나의 core 리포지토리를 병합해야하는 저장소가 여러 개 있습니다. core 저장소는 모든 저장소에 remote 저장소로 설정됩니다.git 저장소의 기존 파일을 모두 .gitignore의 파일을 제외한 다른 원격 브랜치로 바꾸십시오.

는 일반적으로 저장소를 업데이트하는 나의 작업 흐름은 다음과 같이 진행됩니다

git reset --hard origin/master 
git pull origin master 
git fetch core master 

나는 다음 git merge --squash core/master을하고 remote로 다시 저장소를 밀어 전에 충돌을 해결.

각각의 저장소에 대해 .gitignore 파일의 모든 것을 제외하고는이 저장소의 모든 내용이 기술적으로 정확하게 core 저장소와 동일해야하기 때문에 약간 중복됩니다.

리포지토리 수가 늘어남에 따라 core 분기를이 리포지토리로 가져 오는 더 효율적인 방법은 구체적으로 언급 된 것을 제외하고 기존 파일을 모두 대체해야한다는 것입니다. .gitignore git 히스토리와 로그에서 무결성을 유지하는 동안.

+0

[submodule] (https://git-scm.com/docs/git-submodule)을 사용할 수 없습니까? –

+0

'git checkout branch - files ...'를 원합니까? – o11c

+0

힘내가 프로젝트 수준에서 일하고있다. 하위 모듈을 사용하지 않는 한 특정 파일에 대해 대체 리모컨을 "선택"할 수 없습니다. –

답변

0

git과 bash의 조합으로 할 수 있습니다. 어떻게 수행 할 수 있는지 보여주기 위해 샘플 스크립트를 작성했습니다. 당신은 항상 그것을 수정할 수 있고 더 나아질 수 있습니다. 나는 또한 약간의 설명을 제공했다. 이 파일의 이름은 adder.sh입니다.

#!/bin/bash 
# $1 -> Files from the branch you want (core) 
# $2 -> Branch you want to merge into (master) 

git checkout $2 
git diff --name-status $1..$2 | grep '^\(D\|M\)\s*' | cut -f2 > ~/.dummy 
git checkout $1 -- $(cat ~/.dummy) 
git add . 

호출하려면 $ sh adder.sh core master을 사용하십시오. 그 후에 core 지점의 모든 새로 추가되거나 수정 된 파일이 master repo에 추가됩니다. git status를 사용하면 새로운 것이 무엇인지 알 수 있고 그에 따라 커밋하고 푸시 할 수 있습니다.

$ git commit -m "Skipping Conflicts" 
$ git push 

어떻게 작동하는지에 대한 일부 설명 :

$ git diff --name-status master..core 

는 다음과 같은 출력을 생성합니다 :

M  public/stylesheets/main.css    # Modified 
D  public/templates/createUser.html   # Present in core branch and not master (new file) 
A  public/templates/dashboard.html   # Present in master and not in the core branch (don't touch) 

그래서만을 수정하고 새로운 파일을 선택하는 간단한 정규식 쓰기를하고 적절한 형식으로 수정 한 다음 임시 파일에 저장하십시오.

$ cat ~/.dummy 

public/templates/createUser.html 
public/stylesheets/main.css 

그런 다음 파일을 현재 분기에 추가해야하므로 git checkout을 사용해야합니다. git checkout을 사용하는 방법은 this answer을 참조하십시오.


다른 방법이 있습니다. 공식적인 방법은 git rerere입니다. the man page에서 : 토픽 브랜치가 (중 수행 한 "해제"지점에 합병, 또는 전송 될 때까지

워크 플로우가 상대적으로 긴 살았 주제 가지를 사용에서, 개발자는 때로는 또 다시 같은 충돌을 해결하기 위해 필요 아웃룩으로 받아 들여짐).

이 명령은 충돌이있는 자동 결과와 해당 수동 해결 결과를 초기 수동 병합에 기록하고 이전에 기록한 손 해상도를 해당 자동 완성 결과에 적용하여이 프로세스에서 개발자를 지원합니다.

참고 :이 명령을 사용하려면 구성 변수 rerere.enabled를 설정해야합니다.

This article은 명령과 그 사용 사례에 대한 적절한 개요를 제공합니다.

+0

내가 잘못하지 않는 한, 원래 저장소의 git 히스토리가 유지되지 않습니다. 핵심 저장소로 대체합니다. –

+0

@KamranKhan, 맞아. 커밋 내역을 유지하려면 두 번째 옵션을 시도해야합니다. – TheChetan

+0

@KamranKhan, 오늘 git 병합 문서를 검토했는데 [이 답변] (https://stackoverflow.com/a/13307342/4110233)을 발견했습니다. 그래서 너 도움이되는지 알아봐. – TheChetan