로컬 변경 사항을 유지하는 git pull 업데이트되지만이 파일은 변경되지 않고 병합되지

업스트림 변경 사항이 있어도 특정 파일을 그대로 유지하면서 git 프로젝트를 안전하게 업데이트 (풀)하는 방법은 무엇입니까?

myrepo / config / config.php

이 파일이 원격에서 변경 되더라도 git pull을 사용할 때 다른 모든 것이 업데이트되지만이 파일은 변경되지 않고 병합되지 않는 방법이 있습니까?

추신. git 기반 배포 스크립트 만 작성하기 때문에 내가 원하는 것을해야합니다. 구성 파일을 템플릿으로 변경할 수 없습니다.

따라서 로컬로 변경된 내용을 잃지 않는 업데이트 스크립트를 작성하는 방법이 필요합니다. 나는 다음과 같은 간단한 것을 원했습니다.

git assume-remote-unchanged file1
git assume-remote-unchanged file2

그때 git pull



답변

Git 숨김을 기반으로하는 간단한 솔루션이 있습니다. 변경 한 내용을 모두 숨기고 모든 새로운 내용을 가져와 숨김을 적용하십시오.

git stash
git pull
git stash pop

숨김 팝에서 충돌이있을 수 있습니다. 당신이 묘사하는 경우에 실제로 충돌이 생길 것입니다 config.php. 그러나, 당신이 은닉에 넣은 것이 당신이 원하는 것임을 알기 때문에 갈등을 해결하는 것은 쉽습니다. 이렇게하십시오 :

git checkout --theirs -- config.php


답변

저장소에 대부분의 풀러가 사용자 정의 해야하는 파일이 있으면 파일의 이름을 바꾸고에 config.php.template추가 config.php하십시오 .gitignore.


답변

업데이트 : 이것은 문자 그대로 질문에 대답하지만 KurzedMetal의 대답 은 실제로 당신이 원하는 것이라고 생각 합니다.

가정 :

  1. 당신은 지점에있어 master
  2. 상류 지점 인 masterorigin
  3. 커밋되지 않은 변경 사항이 없습니다.

…. 할 수있는 일 :

# Do a pull as usual, but don't commit the result:
git pull --no-commit

# Overwrite config/config.php with the version that was there before the merge
# and also stage that version:
git checkout HEAD config/config.php

# Create the commit:
git commit -F .git/MERGE_MSG

자주 수행해야하는 경우 별명을 작성할 수 있습니다. 커밋되지 않은 변경 사항이있는 경우 변경 사항이 취소 config/config.php됩니다.


답변

rebase로 git pull을 시도 할 수도 있습니다.

git pull --rebase origin dev


답변

질문에 대답하려면 : 체크 아웃의 특정 파일을 제외하려면 스파 스 체크 아웃을 사용할 수 있습니다

1) .git/info/sparse-checkout에서 보관할 대상을 정의하십시오. 여기서 우리는 모두 (*)를 원하지만 (느낌표에주의하십시오) config.php :

 /*
 !/config.php

2) 자식에게 스파 스 체크 아웃을 고려하고 싶다고 말하십시오.

 git config core.sparseCheckout true

3)이 파일을 로컬에 이미 가지고 있다면, git이 스파 스 체크 아웃에서 수행하는 작업을 수행하십시오 ( “skip-worktree”플래그를 설정하여이 파일을 제외시켜야 함).

git update-index --skip-worktree config.php

4) config.php 파일이있는 저장소를 사용하십시오-저장소의 변경 사항이 무엇이든간에.


구성 값은 소스 제어에 있지 않아야합니다.

  • 잠재적 인 보안 위반입니다
  • 배포시 이와 같은 문제가 발생합니다.

이것은 당신이 그것들을 배제하고 (첫 커밋 전에 .gitignore에 넣어야 함) 앱을 체크 아웃하는 각 인스턴스에 적절한 파일을 생성해야합니다 ( “템플릿”파일을 복사하고 수정하여)

git이 파일을 담당하면 .gitignore는 아무런 영향을 미치지 않습니다.

파일이 소스 제어하에 있으면 두 가지 선택 만 할 수 있습니다.-파일을 제거하기 위해 모든 히스토리를 리베이스 ( git filter-branch-)-파일을 제거하는 커밋을 작성하십시오. 그것은 잃어버린 전투와 싸우는 것과 같지만 때로는 그와 함께 살아야합니다.


답변

커밋되지 않은 로컬 변경 사항 인 경우 당기는 동안 병합 충돌을 피하십시오.

git stash save
git pull
git stash pop

참조-https: //happygitwithr.com/pull-tricky.html


답변