git이 파일의 향후 개정을 무시하도록하려면 어떻게해야합니까?


140

git 저장소에 포함 된 파일의 기본 버전을 만들었습니다. 누군가가 저장소를 복제 할 때이 파일의 사본을 얻는 것이 중요합니다. 그러나 나중에이 파일의 변경 사항을 무시하도록 git을 설정하고 싶습니다. .gitignore추적되지 않은 파일에서만 작동합니다.

이 동기에는이 파일에 컴퓨터 별 정보가 포함되어 있습니다. 기본 값을 제공하면서 사람들이 원본 리포지토리로 푸시되지 않는 로컬 변경을 수행하여 새 변경 사항을 가져올 때 병합 충돌이 발생하도록 허용하고 싶습니다.

우리는 일반적으로 꽤 게으르고 git add .많이 사용 하기 때문에 git 에게이 파일을 무시하도록 지시 할 수 없다면 변경하면 커밋되고 밀려날 것입니다.

요약,

  1. 파일을 만들고 default_values.txt싶습니다 .git 저장소에 추가되고 누군가가 해당 저장소를 복제 할 때 포함 되는 파일을 호출하십시오 .
  2. git add .default_values.txt커밋에 추가해서는 안됩니다 .
  3. 이 동작은 저장소의 모든 복제본으로 전달되어야합니다.

1
수정 된 파일이 default_values.txt 인 경우 커밋을 중단시키는 프리 커밋 후크를 갖기 위해 git hooks을 사용할 수 있습니까?
sateesh

1
힘내 순수 주의자들은 게으르지 않고 준비 영역을 올바르게 사용한다고 말합니다.
Xint0

힘내 순수 주의자들은 얼룩 / 깨끗한 스크립트를 사용한다고 말합니다. 가장 유지 보수가 쉬운 솔루션입니다.
Adam Dymitruk

1
Xint0 : 맞습니다. 하지만 다른 사람들이 실수로 체크인하지 못하게하는 방법은 무엇입니까?
Alan

답변:


115

많은 사람들이 언급했듯이 현대적인 좋은 해결책은 다음과 같습니다.

git update-index --skip-worktree default_values.txt

다음과 같이 다시 허용하기로 결정할 때까지 로컬 및 업스트림에서 해당 파일의 변경 사항을 무시합니다.

git update-index --no-skip-worktree default_values.txt

생략 된 것으로 표시된 파일 목록을 얻을 수 있습니다.

git ls-files -v . | grep ^S

그와는 달리 주 --skip-worktree--assume-unchanged업스트림 변경이 당겨되면 상태가 소실됩니다.


2
다른 사람이 저장소를 가져 와서 파일을 편집하면 디렉토리의 변경 사항이 무시됩니까? --no-skip-worktree변경 사항을 추가 하기 위해 입력해야하기를 바랍니다 .
neaumusic

3
변경 사항으로 수행되는 작업은 변경 사항에 의해 제어됩니다. 다시 말해, 변경 사항을 적용하지 않으려면 리포지토리의 파일에 skip-worktree를 설정해야합니다. 이 파일이 모든 사람에게 전송 된 후 모든 후속 변경 사항을 무시하도록되어있는 파일이면 모두 동일한 지침을 따라야합니다.
moodboom

3
--skip-worktree다른 지점에서 동일한 파일을 추적하는 경우 지점을 전환하기 전에 파일 상태 를 취소해야 할 수도 있습니다 .
moodboom

3
흠 내가이에 표시되지 않은 파일에 일부 변경 한 후에는 ... 작동 git status하지만 다른 지점에 체크 아웃을 시도 할 때, 내가있어 error: Your local changes to the following files would be overwritten by checkout: , 심지어 -f하지 않습니다 도움error: Entry 'wix-stores-merchant-app/demo/credentials.js' not uptodate. Cannot merge.
ykravv

1
git ignore와에 별칭이 git unignore있습니다.
Michael

48

당신이 찾고있는 것은 git update-index --assume-unchanged default_values.txt입니다.

자세한 내용은 문서를 참조하십시오 : http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html


11
이 작동하지 않습니다. 비록 그것이 git add. 로컬 브랜치에서 파일을 무시하면, 아카이브의 복제본에는이 동작이 없습니다 (복제 된 아카이브에서 default_values.txt를 변경하면 "git add"로 커밋에 추가됩니다)
Marc

6
예, 로컬 리포지토리에만 설정하기 때문입니다. 이런 종류의 정보는 푸시 할 수 없습니다.
tamasd

8
@Indradhanush-이 솔루션은 기준 3을 만족하지 않습니다. "동작은 저장소의 모든 복제본으로 전달되어야합니다."– 따라서이를 받아들이지 않았습니다. 좋은 답변이 아니라는 의미는 아닙니다.
Marc

나는 세 번째 기준을 눈치 채지 못했습니다. 내가 찾지 않았기 때문입니다. :)
Indradhanush Gupta

3
개인 응용 프로그램 설정 로컬 설정 파일의 경우, 당신은 가능성이 사용하고자하는 skip-worktree대신 assume-unchanged더 많은 정보 stackoverflow.com/questions/13630849/...
아론 호프만

22

필자가 일반적으로 본 방법은 다른 이름으로 파일을 작성하는 것입니다 (예 : default_values_template.txt). .gitignore에 default_values.txt를 넣으십시오. 사람들에게 로컬 작업 공간에서 default_values_template.txt를 default_values.txt로 복사하고 필요에 따라 변경하도록 지시하십시오.


흠 ... 아마도 default_values가 없으면 default_values_template을 default_values에 자동으로 복사하는 후크를 작성할 수 있습니까?
Marc

2
이것은 내 경험에서 이것을 해결하는 가장 일반적인 방법입니다. 그것은 "그냥 작동"한다는 점에서 가장 저항이 적은 경로이며, 로컬 구성 파일이 있는지 코드를 쉽게 확인하고 그렇지 않은 경우 유용한 오류를 제공 할 수 있습니다.
Jani Hartikainen

솔루션은 실제로 이와 같은 작업을 수행한다고 생각합니다. 바로 끌거나 복제 할 때마다 스크립트가 실행되는 것이 좋습니다. 한 가지 아이디어는 특정 확장자 (예 : .basefile)를 가진 파일은 확장자가 드롭 된 파일로 복사 된 다음 파일 이름이 해당 디렉토리의 .gitignore에 추가된다는 것입니다. 그래서 default_values.txt.basefile 파일을 만들고 커밋합니다. 나는 이것을 할 자식이나 펄 찹이 없지만, 친구에게 물어보고 그것이 어떻게 작동하는지 알려줄 것이다.
Marc

1
@AdamDymitruk : 그렇습니다.이 경우에는 깨끗 / 얼룩을 사용할 수 있지만 이것이 최선의 선택이라는 것은 분명하지 않습니다. 예를 들어, 깨끗하고 얼룩이 생길 수 있으므로 사람들이 실제로 파일을 변경 하려는 경우 다소 어려워집니다 . 실제로 여기에 설명 된 접근 방식을 선호합니다.
sleske

1
git 자체 (특히 git hooks)에서 큐를 가져 와서 .sample접미사를 사용합니다 . 따라서 귀하의 경우default_values.txt.sample
tir38

5

얼룩 / 깨끗한 스크립팅을 살펴보십시오. 이 방법으로 파일을 버전 제어 할 수 있지만 체크 아웃되면 일반 / 자리 표시 자 데이터를 파일의 시스템 특정 데이터로 바꾸어 파일을 "스머지"합니다.

커밋 할 때 컴퓨터 별 정보를 일반 또는 자리 표시 자 정보로 바꾸어 "정리"합니다.

얼룩 / 깨끗한 스크립트는 스크립트를 여러 번 적용하면 순서대로 마지막 스크립트를 실행하는 것과 같은 순서로 결정적이어야합니다.

리포지토리를 노출해야하지만 내용에 중요한 정보가 포함되어있는 경우에도 암호를 적용 할 수 있습니다.


Clean 및 Smudge 스크립트는 로컬 또는 리포지토리의 일부입니까?
Alan

예. :) ... 즉, 저장소를 통해 얼룩을 깨끗하게 공유 할 수 있지만 프로덕션 암호와 같은 민감한 데이터가 포함되어 있으면 좋지 않습니다. 이것이 중요하지 않은 경우, git에서는 스크립트를 명시 적으로 활성화해야합니다. 그렇지 않으면 사람들은 github 및 기타 공유 저장소를 통해 다른 사용자에게 악의적 인 일을 할 수 있습니다.
Adam Dymitruk

이것에 대해 조금 더 읽어야합니다. 기본적으로 user.json각 개발자 자격 증명으로 덮어 써야 하는 기본값이있는 프로젝트를 설정하고 싶지만 개발자가 실수로 자신의 자격 증명을 확인하고 싶지는 않습니다.
Alan

깨끗한 얼룩 예제 스크립트를 위해 Google 주위를 둘러 볼 것입니다. 무엇이 나오는지보십시오. 또한, 프리 노드의 git irc room에서 점프하십시오. 즉시 도움을받을 수 있습니다.
Adam Dymitruk

3

인덱스에서 파일의 내용을 간단히 정리하기 위해 "clean"필터를 정의하여이 문제를 해결했습니다.

git show :path/to/myfile 지정된 파일의 색인 내용을 인쇄해야하므로 스크립트에서 해당 내용을 사용하여 작업 사본을 색인의 수정되지 않은 사본으로 바꿀 수 있습니다.

#! /bin/sh

git show :$1

해당 파일을 "clean"필터로 설정하십시오 ( "discard_changes"에 넣었다고 가정).

$ git config filter.ignore_myfile.clean "discard_changes path/to/myfile"
$ echo "path/to/myfile filter=ignore_myfile" >> .gitattributes

불행히도 클린 스크립트 내부에서 처리중인 파일을 알 수있는 방법이 없으므로 여러 파일에 일반화 할 수있는 방법을 찾을 수 없습니다. 물론 각 파일에 대해 다른 필터 규칙을 추가하는 것을 막을 수는 없지만 약간 어색합니다.


1

팀에 적합한 솔루션을 찾았습니다. 우리는 심볼릭 링크를 통해 githook을 공유하고 git에 템플릿 파일을 추가 한 후 템플릿 파일이 수정되었는지 여부와 확인하는 pre-commit hook을 추가했습니다 git reset -- templatefile.txt. 파일이 변경된 유일한 파일이라면 커밋을 중단합니다.


-1

하위 모듈을 살펴 보는 것이 좋습니다. 머신 특정 파일을 서브 모듈에 배치하면 git add는이를 무시해야합니다.


이것은 좋은 생각이지만 github에 단일 파일 저장소를 넣어야합니다 .github을 사용하고 있으며 제한된 수의 저장소를 가지고 있기 때문에 최적이 아닙니다.
Marc

@Marc는 Visual Studio Team Services, 무제한 무료 개인 프로젝트 및 자식 저장소를 살펴 봅니다. Kanban 보드, 작업 항목 및 버그 추적, 체크인을 작업 항목과 연결, 스크럼 또는 기타 프로젝트 유형의 경우 스프린트를 관리합니다. 뿐만 아니라 여러 플랫폼에 대해 구축 할 수있는 훌륭한 빌드 도구를 갖추고 있으며 언급 할 것이 너무 많습니다. 일부 사람들은 Microsoft이기 때문에 슬래그하지만 저장소 호스팅 외에도 도구 측면에서 github이 제공하는 것을 능가합니다. 당신이 무료로 할 수있는 일에는 한계가 있지만 나는 그것을 초과하지 않습니다.
Aran Mulholland 2012 년

@Marc 정말 유용한 점은 원하는만큼 많은 계정을 설정할 수 있다는 것입니다. 따라서 소스 컨트롤을 소유하려는 고객을 위해 프로젝트를 작성하는 경우 계정을 만들고 사용할 수 있습니다 프로젝트를 계획, 설계 및 실행하고 완료되면 고객에게 계정 소유권을 전달할 수 있습니다.
Aran Mulholland
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.