파일을 'git commit'하고 내용 변경을 무시할 수 있습니까?


355

팀의 모든 개발자는 자체 로컬 구성이 있습니다. 이 구성 정보는 devtargets.rb레이크 빌드 작업에 사용되는 파일에 저장됩니다 . 그래도 개발자가 서로의 devtargets 파일을 복제하지 않기를 바랍니다.

내 첫 번째 생각은 그 파일 .gitignore을 git에 커밋하지 않도록 목록 에 넣는 것이 었습니다 .

그런 다음 궁금해하기 시작했습니다. 파일을 커밋 할 수는 있지만 파일 변경 사항을 무시할 수 있습니까? 따라서 기본 버전의 파일을 커밋 한 다음 개발자가 로컬 컴퓨터에서 파일을 변경하면 git이 변경 사항을 무시하고 git status 또는 git commit을 수행하면 변경된 파일 목록에 표시되지 않습니다. .

가능합니까? 확실히 좋은 기능이 될 것입니다 ...


1
비슷한 주제에 대한 stackoverflow.com/questions/3318043/… 도 참조하십시오 .
VonC


답변:


458

물론, 나는 이것을 사용하여 때때로 정확하게

git update-index --assume-unchanged [<file> ...]

추적을 취소하고 다시 시작하려면 (추적되지 않은 파일을 잊어 버린 경우이 질문 참조 ) :

git update-index --no-assume-unchanged [<file> ...]

관련 문서 :

-[no-] 가정하지 않은 것으로 가정
이 플래그를 지정하면 경로에 대해 기록 된 객체 이름이 업데이트되지 않습니다. 대신이 옵션은 경로에 대해 "변경되지 않은 것으로 가정"비트를 설정 / 설정 해제합니다. "변경되지 않은 것으로 가정"비트가 켜져 있으면, 사용자는 파일을 변경하지 않겠다고 약속하고 Git이 작업 트리 파일이 인덱스에 기록 된 것과 일치한다고 가정 할 수 있습니다. 작업 트리 파일을 변경하려면 Git에 알리기 위해 비트를 설정 해제해야합니다. lstat(2)시스템 호출 이 매우 느린 파일 시스템 (예 : cifs) 에서 큰 프로젝트로 작업 할 때 유용 합니다.

커밋에서 병합 할 때 인덱스에서이 파일을 수정해야하는 경우 Git은 (정상적으로) 실패합니다. 따라서 추적되지 않은 것으로 가정 된 파일이 업스트림으로 변경되는 경우 상황을 수동으로 처리해야합니다.

이 경우 정상적으로 실패하면 풀을 수행 할 때 해당 파일의 업스트림 변경 사항 (적당한 변경 사항 등)이 있으면 다음과 같이 표시됩니다.

$ git pull
…
From https://github.com/x/y
   72a914a..106a261  master     -> origin/master
Updating 72a914a..106a261
error: Your local changes to the following files would be overwritten by merge:
                filename.ext

병합을 거부합니다.

이 시점에서 로컬 변경 사항을 되 돌리면이를 극복 할 수 있습니다. 한 가지 방법이 있습니다.

 $ git checkout filename.ext

그런 다음 다시 당겨서 로컬 파일을 수정하거나 –no-assume-unchanged, 그 시점에서 정상적인 숨김 및 병합 등을 수행하십시오.


10
이 명령은 .git 폴더에서 로컬로 수행합니까? config.php 파일에 대해이 명령을 실행하면 repo를 사용하는 다른 사용자에게 전파됩니까?
Magus

16
@ 마구스 : 아니오. 이것은 당신을 위해 작동합니다.
Rob Wilkerson

3
그리고 곧 나중에는 파일이 변경되지 않은 가정한다 확인하는 방법을 알고 싶은거야 : stackoverflow.com/questions/2363197/...을
치로 틸리가郝海东冠状病六四事件法轮功

10
"git stash"를 사용하면 이러한 방식으로 무시 된 파일의 변경 내용이 손실됩니다. 그 주위에 방법이 있습니까?
Alexis

5
이것은 목적이 아닙니다 git update-index --assume-unchanged. public-inbox.org/git/…
jsageryd

97

이 대답에git update-index --skip-worktree <file> 설명 대로 선호하는 방법은을 사용 하는 것입니다 .

assume-unchanged파일 그룹이 수정되었는지 확인하는 데 비용이 많이 드는 경우를 위해 설계되었습니다. 비트를 설정하면 git (물론)은 인덱스의 해당 부분에 해당하는 파일이 작업 복사본에서 수정되지 않은 것으로 가정합니다. 따라서 통계 호출의 혼란을 피할 수 있습니다. 이 비트는 색인에서 파일의 항목이 변경 될 때마다 (파일이 업스트림으로 변경 될 때) 손실됩니다.

skip-worktreegit이 파일이 수정되었다는 것을 알거나 (재설정 --hard 등으로 수정해야 함), 색인의 버전을 대신 사용하지 않은 것처럼 가장합니다. 인덱스가 삭제 될 때까지 지속됩니다.

이것을 취소하려면 git update-index --no-skip-worktree <file>

git 버전 2.25.1부터는 더 이상 권장되는 방법이 아닙니다.

사용자는 종종 변경되지 않은 및 건너 뛰기 작업 비트를 사용하여 Git에게 추적 된 파일의 변경 사항을 무시하도록 지시합니다. Git이 특정 작업을 수행 할 때 인덱스에 대해 작업 트리 파일을 계속 검사 할 수 있으므로 예상대로 작동하지 않습니다. 일반적으로 Git은 추적 된 파일의 변경 사항을 무시할 수있는 방법을 제공하지 않으므로 대체 솔루션이 권장됩니다.

예를 들어, 변경하려는 파일이 일종의 구성 파일 인 경우 리포지토리에는 샘플 구성 파일이 포함될 수 있으며이 파일은 무시 된 이름으로 복사되어 수정 될 수 있습니다. 리포지토리에는 샘플 파일을 템플릿으로 취급하여 자동으로 수정 및 복사하는 스크립트가 포함될 수도 있습니다.


리포지토리를 체크 아웃하는 모든 사용자에게 적용됩니까? 특정 파일을 가져 오지만 명시 적으로 언급하지 않는 한 실수로 변경 사항을 추가 할 수 없습니까?
mmm

2
@momomo 플래그는 인덱스에 저장되므로 단일 사용자 전용입니다. 모든 사용자에게 적용되는 기능에 대해서는 erjiang의 답변 을 참조하십시오 .
1615903

파일의 내용이 무엇인지 파악하려고합니다. 나는 당신이 언급 한 답변에 대해 언급했지만 대답이 없습니다. 위치는 어디이며 내용은 무엇입니까? 당신은 알고 있습니까?
mmm

나는 따르고 있지 않다. 명령은 명령에서 지정한 하나의 특정 파일을 무시하는 데 사용됩니다. 해당 파일의 내용은 관련이 없습니다.
1615903

1
힘내 문서는 특별히 사용하지 말한다 git update-index --skip-worktree이러한 목적을 위해.
bk2204

43

일반적인 관행은 a를 만들고 devtargets.default.rb커밋 한 다음 각 사용자에게 해당 파일을 복사하도록 지시 하는 것 같습니다 devtargets.rb(.gitignore 목록에 있음). 예를 들어 CakePHP는 데이터베이스 구성 파일에 대해 동일한 작업을 수행하는데,이 파일은 시스템마다 자연스럽게 변경됩니다.


6
추적중인 파일을 .gitignore 할 수 없습니다. .gitignore는 색인에없는 파일에만 영향을줍니다.
CB Bailey

1
나는 정말로 좋은 이유가 없지만이 작업을 피하려고했습니다. 우리는 지금하고 있고 이름에 ".default"없이 내 자신의 버전을 만들어야한다는 것을 기억하는 것이 고통 스럽다고 생각합니다.
데릭 베일리

11
@DerickBailey 그러나 공평하게 말하면 --assume-unchanged, 저장소를 복제하는 모든 사람에게 옵션을 사용하는 것을 기억하는 것보다 파일을 복사하는 것이 더 쉽습니다 .
Dan

1
@DerickBailey 당신은 또한 존재하지 않는 devtargets.default.rb경우 레이크 빌드를 기본값으로 설정할 수 devtargets.rb있습니다.
Luke

@erjang 해당 devtargets.default.rb 파일에 무엇입니까? 예를 들어?
mmm

2

IntelliJ IDEA 사용자의 경우 : 파일 (또는 파일)의 변경 사항을 무시하려면 파일을 다른로 옮길 수 있습니다 Change Set.

  • 에 이상 머리 Local Changes( Cmd + 9)
  • 무시하려는 파일을 선택하십시오.
  • F6 그들을 다른 곳으로 옮기기 위해 Change Set
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.