Git-병합 중 파일 무시


114

myrepo원격 beanstalk서버 에서 리포지토리가 호출 되었습니다 .

내 로컬 컴퓨터에 복제했습니다. 두 개의 추가 분기 : stagingdev. 이 지점도 원격지로 밀었습니다.

지금:

 local                   remote                   server
 --------------------------------------------------------  
 master  ==> Pushes to  `master`  ==> deployed to `prod`
 staging ==> Pushes to  `staging` ==> deployed to `staging`
 dev     ==> Pushes to  `dev`     ==> deployed to `dev`

config.xml각 분기마다 다른 파일 이 있습니다.

병합 중에 만이 파일을 무시하고 싶습니다. 하지만 repo 브랜치에서 체크 아웃하거나 커밋 할 때 이것이 포함되기를 원합니다.

내가 원하는 이유는 특정 브랜치를 가져와 (체크 아웃) 각 서버에 배포하는 배포 스크립트가 있기 때문입니다. 따라서 config.xml배포시 위에 표시된대로 특정 분기의 파일이 특정 서버로 이동 해야 합니다.

.gitignore작동하지 않을 것 같아요 . 다른 옵션은 무엇입니까? 무시 된 파일은 체크 아웃 및 커밋의 일부 여야하며 이는 중요합니다. 병합 중에 만 무시해야합니다.

감사!


기본 모드에서 git pull은 git fetch와 git merge FETCH_HEAD의 약자입니다. 그래서 당신은 서로 갈등을 말합니다.
zzk 2013 년

글쎄, 그 계산대. 당기지 마십시오. 명확하게 질문을 업데이트하겠습니다.
Kevin Rave 2013 년


2
이것에 대한 해결책을 찾은 적이 있습니까? git 속성은 파일이 병합되는 분기간에 충돌이있는 경우에만 유용하므로 항상 충분하지는 않습니다.
pvinis

상징적 (git이 뒤 따르지 않음) 또는 구조에 대한 하드 링크를 조사 했습니까?
프랭크 Nocke

답변:


94

--no-commit옵션과 함께 git merge 명령을 사용하여이 문제를 해결 한 다음 준비된 파일을 명시 적으로 제거하고 파일의 변경 사항을 무시합니다. 예 : myfile.txt다음과 같이 진행 하려면 변경 사항을 무시하고 싶습니다 .

git merge --no-ff --no-commit <merge-branch>
git reset HEAD myfile.txt
git checkout -- myfile.txt
git commit -m "merged <merge-branch>"

건너 뛸 파일 목록이있는 경우 문 2 및 3을 for 루프에 넣을 수 있습니다.


2
빨리 감기 전략에서 병합이 발생할 때 파일을 덮어 쓰지 않으려면 "--no-ff"를 추가합니다.
Ilia Shakitko

1
그래서 git reset HEAD myfile.txt정확히 무엇을합니까? 여기서 우리의 목표에 어떻게 도움이됩니까?
Kid_Learning_C jul.

라인 2와 3을 어떻게 루프에 넣습니까?
AndroidDev

52

결국 git을 찾았습니다 attributes. 그것을 시도. 지금까지 일하고 있습니다. 아직 모든 시나리오를 확인하지 않았습니다. 그러나 그것이 해결책이어야합니다.

병합 전략-Git 속성



1
다음은 git 속성 문서의 병합 전략 섹션에 대한 올바른 링크입니다. git-scm.com/book/en/v2/…
Adrian Laurenzi

3
이 내용이 잘 설명 된 기사 medium.com/@porteneuve/…
ShawnFeatherly

10
충돌이 없으면 문제가되는 것 같습니까? 파일이 여전히 병합됩니까?
Brett

18

.gitattributes -하위 디렉토리 또는 파일 하위 집합에 대한 속성을 정의하는 저장소의 루트 수준 파일입니다.

특정 파일에 대해 다른 병합 전략을 사용하도록 Git에 알리는 속성을 지정할 수 있습니다. 여기서는 config.xml브랜치를 위해 기존을 보존하고 싶습니다 . 우리는 설정할 필요 merge=oursconfig.xml에서 .gitattributes파일.

merge=ours 병합 충돌이 발생하면 git에게 우리 (현재 분기) 파일을 사용하도록 지시하십시오.

  1. .gitattributes저장소의 루트 수준에 파일 추가

  2. .gitattributes파일 에서 confix.xml에 대한 속성을 설정할 수 있습니다.

    config.xml merge=ours
    
  3. 그런 다음 다음을 사용하여 더미 우리의 병합 전략을 정의하십시오.

    $ git config --global merge.ours.driver true
    

stag양식 dev브랜치 를 병합하면 병합 이 config.xml 파일과 충돌하는 대신 stag 브랜치의 config.xml이 원래 있던 버전으로 유지됩니다.


16
하지만 갈등이 없다면 어떨까요? 병합하는 동안 항상 특정 파일을 유지하는 방법은 무엇입니까?
Igor Yalovoy

2
@IgorYalovoy는 : 충돌이없는 경우 실제로 해시 ID를에서 작동하기 때문에 ... 물론,이 조금 까다 롭습니다하지만, 다음과 같은 경우 config.xml이다 완전히 변화 중 하나 가지 팁 버전으로 병합베이스에서, 힘내은하지 않고, 변경된 버전을 소요 보고merge.ours.driver 설정을 있습니다. 그래서 당신은 걱정하는 것이 옳습니다.
torek

1
Git 문서에서 복사하여 붙여 넣기 : 병합 전략-Git 속성. 링크
kyb

이 방법은 FYI 때마다 "커밋 병합"을 발생시킵니다.
rsmets

2
"우리"는 도입되는 새로운 전략에 대한 임의의 이름 인 것으로 보입니다. theirs기본 제공 병합 전략 이기 때문에 혼란 스러웠습니다 . 그러나 <pattern> merge=foo, 그때를 쓸 수있는 것 같고 git config --global merge.foo.driver true같은 방식으로 작동 할 것입니다.
Kyle Strand

8

를 사용하여 git merge --no-commit시작한 다음 원하는 방식으로 병합을 편집 할 수 있습니다. 즉, 준비 해제 config.xml또는 다른 파일을 사용한 다음 커밋합니다. 후크를 사용하여 추가로 자동화하고 싶겠지 만 적어도 한 번은 수동으로 진행할 가치가 있다고 생각합니다.


2
git attributes직접적인 솔루션을 제공 합니까 ? 나는 이것을 이해할 수 없다. git-scm.com/book/en/…
Kevin Rave

4

를 사용 하여 저장소 외부에 .gitignore보관 config.xml한 다음 커밋 후 후크 를 사용 하여 적절한 config.xml파일을 서버 에 업로드 할 수 있습니다 .


1
나는 그것이 일종의 해킹이라는 것을 알고 있습니다. 깨끗한 해결책을 찾으려고합니다. 자식은 어떻습니까 attributes. 어떻게 작동하는지 아십니까? 나는 이것을 이해할 수 없다. git-scm.com/book/en/…
Kevin Rave

1
나는 이것들에 대해 들어 본 적이 없으며 merge = ours 속성을 적용하려고 시도하고 있습니다.
tlehman

1
힘내 속성은 굉장합니다! 텍스트가 아닌 파일을 비교하는 방법을 git에게 알려줄 수도 있으므로 pdf2text를 사용하여 PDF를 비교할 수 있습니다!
tlehman 2013 년

2

예:

  1. 두 개의 분기가 있습니다. master ,develop
  2. develop브랜치에 파일을 생성 했으며 병합하는 동안 무시하고 싶습니다.

암호:

git config --global merge.ours.driver true
git checkout master
echo "path/file_to_ignore merge=ours" >> .gitattributes
git merge develop

동일한 확장자를 가진 파일을 무시할 수도 있습니다.

예를 들어 .txt확장자가있는 모든 파일 :

echo "*.txt merge=ours" >> .gitattributes

1

여기 git-update-index-작업 트리의 파일 내용을 색인에 등록합니다.

git update-index --assume-unchanged <PATH_OF_THE_FILE>

예:-

git update-index --assume-unchanged somelocation/pom.xml


밀 때 좋지만 당기면 파일을 덮어 쓸 때 여전히 불평합니다.
Rolf

1
.gitignore 파일에 파일 항목을 추가하려고 했습니까? @Rolf
Sireesh Yarlagadda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.