programing

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

telecom 2023. 5. 15. 21:15
반응형

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

우리 팀의 모든 개발자들은 각자의 로컬 구성을 가지고 있습니다. 구성 는 해당 정다파저일장다니라는 됩니다.devtargets.rb우리의 레이크 빌드 작업에 사용됩니다.하지만 나는 개발자들이 서로의 devtargets 파일을 해킹하는 것을 원하지 않습니다.

내 첫 번째 생각은 그 파일을 그 안에 넣는 것이었습니다..gitignoregit에 합니다.

그리고 나서 저는 의문이 들기 시작했습니다. 파일을 커밋할 수 있지만 파일의 변경 사항은 무시할 수 있습니까?따라서 기본 버전의 파일을 커밋한 다음 개발자가 로컬 컴퓨터에서 파일을 변경할 때 git는 변경 사항을 무시하고 git 상태나 git 커밋을 수행할 때 변경된 파일 목록에 나타나지 않습니다.

그게 가능한가요?정말 좋은 기능이 될 겁니다

네, 저는 정확하게 가끔 이것을 사용합니다.

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

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

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

관련 문서:

[no-time]--[no-time]에 있습니다.
이 플래그를 지정하면 경로에 대해 기록된 개체 이름이 업데이트되지 않습니다.대신 이 옵션은 경로에 대해 "변경되지 않은 가정" 비트를 설정/설정 해제합니다.되지 않은 " 합니다."변경되지 않은 것으로 가정" 비트가 켜져 있으면 사용자는 파일을 변경하지 않겠다고 약속하고 Git가 작업 트리 파일이 인덱스에 기록된 것과 일치한다고 가정할 수 있습니다.작업 트리 파일을 변경하려면 Git에 알려줄 비트를 해제해야 합니다. 로 매 로 시 도 움 이 때 할 작 업 에 서 템 큰 일 파 린 느 우 ▁this 다 니 됩 ▁when 이 ystem ▁that ▁on ▁working ▁with ▁helpful ▁project ▁is ▁sometimes ▁very ▁a ▁alstat(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그리고 그 시점에서 일반적인 저장 및 병합 등을 수행할 수 있습니다.

이를 위해 선호되는 방법은 다음을 사용하는 것입니다.git update-index --skip-worktree <file>다음 답변에서 설명한 것처럼:

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

skip-worktree그 이상입니다. Git가 파일이 수정되었음을 알고 있거나 재설정으로 수정해야 하는 경우에도 인덱스의 버전을 대신 사용하여 그렇지 않은 것처럼 가장합니다.이 문제는 인덱스가 삭제될 때까지 지속됩니다.

실행 취소하려면 다음을 사용합니다.git update-index --no-skip-worktree <file>

git 버전 2.25.1 이후로는 이 방법도 더 이상 권장되지 않습니다.

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

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

일반적인 관행은 다음을 만드는 것으로 보입니다.devtargets.default.rb각을 각사자에게파복지록시다니합으로 복사하도록 합니다.devtargets.rb(이 목록은 .gitignore 목록에 있음).예를 들어 CakePHP는 시스템 간에 자연스럽게 변경되는 데이터베이스 구성 파일에 대해 동일한 작업을 수행합니다.

Git로 추적된 파일의 변경 사항을 무시할 수 없습니다.Git FAQ는 다음과 같이 설명합니다.

Git은 이것을 할 수 있는 방법을 제공하지 않습니다.그 이유는 체크아웃 시와 같이 Git가 이 파일을 덮어써야 할 경우 파일에 대한 변경사항이 소중한지 보관해야 하는지 또는 관련이 없고 안전하게 파기할 수 있는지 여부를 알 수 없기 때문입니다.그러므로, 그것은 안전한 길을 택해야 하고 항상 그것들을 보존해야 합니다.

git update-index의 특정 기능, 즉 변경되지 않은 가정 및 건너뛰기 작업 트리 비트를 사용하려고 시도하지만 이러한 기능은 이러한 목적으로 제대로 작동하지 않으므로 이러한 방식으로 사용하면 안 됩니다.

구성 파일을 사용하는 것이 목표인 경우 가장 좋은 방법은 예제 또는 템플릿 파일을 추가한 다음 사용자가 파일을 복사하여 적절한 파일을 만들도록 하는 것입니다.그런 다음 실제 구성 파일의 위치를 무시하고 예제 또는 템플릿만 체크인해야 합니다.

IntelliJ IDEA 사용자의 경우:파일에 대한 변경 사항을 무시하려면 파일을 다른 파일로 이동할 수 있습니다.Change Set.

  • 으로 .Local Changes(Cmd + 9)
  • 무시할 파일 선택
  • F6그들을 다른 곳으로 옮깁니다.Change Set

언급URL : https://stackoverflow.com/questions/3319479/can-i-git-commit-a-file-and-ignore-its-content-changes

반응형