일부 파일을 로컬에서 무시하도록 git을 어떻게 구성합니까?


1350

다른 사람들을 위해 전역 자식 설정을 오염시키지 않고 파일을 로컬에서 무시할 수 있습니까? 내 자식 상태에서 스팸 인 추적되지 않은 파일이 있지만 로컬 지점에있는 모든 작은 무작위 추적되지 않은 파일마다 git 구성 변경 사항을 커밋하고 싶지 않습니다.

답변:


1862

에서 관련 힘내 문서 :

특정 리포지토리에만 적용되지만 다른 관련 리포지토리와 공유 할 필요가없는 패턴 (예 : 리포지토리 내에 있지만 한 사용자의 워크 플로에만 해당되는 보조 파일)은 $GIT_DIR/info/exclude파일 로 이동해야 합니다.

.git/info/exclude파일은 같은 형식은 .gitignore파일을. 다른 옵션은 core.excludesFile전역 패턴을 포함하는 파일 이름 으로 설정 하는 것입니다.

스테이지되지 않은 변경 사항이 이미있는 경우 무시 패턴을 편집 한 후 다음을 실행해야합니다.

git update-index --assume-unchanged <file-list>

참고$GIT_DIR : 이것은 git 저장소의 경로를 나타 내기 위해 git 매뉴얼 전체에서 사용되는 표기법 입니다. 환경 변수가 설정되면 원하는 리포지토리의 위치를 ​​덮어 씁니다. 아마도 원하는 것이 아닙니다.


편집 : 또 다른 방법은 다음을 사용하는 것입니다.

git update-index --skip-worktree <file-list>

다음과 같이 바꾸십시오.

git update-index --no-skip-worktree <file-list>

204
참고로, git update-index --assume-unchanged [<file>...]제외 파일에 추가 한 후에 실행해야 합니다. 그때까지는 변경 사항이 적용되지 않습니다.
tollmanz

30
git 1.7.9.5를 사용하여 변경 사항을 적용하기 위해 'git update-index ...'를 실행할 필요가 없습니다.
Jeffrey Martinez

39
파일을 이미 변경하고 무시하려면 git update-index 만 사용하면됩니다. 변경하기 전에 제외를 변경하면 필요하지 않습니다.
브래디 에머슨

13
무시 된 파일과 달리 .gitignore와 같은 커밋 중에 변경된 파일이 표시되지 않게하는 동안 git reset --hard를 실행하면 파일이 repo 버전으로 다시 재설정됩니다.
브래디 에머슨

19
stackoverflow.com/questions/23097368/...stackoverflow.com/questions/13630849/... , skip-worktree가능성이 선호 될 것이다 assume-unchanged.
danShumway

436

업데이트 : git update-index --skip-worktree [<file>...]@danShumway에게 감사드립니다! 두 옵션의 차이점에 대한 Borealid의 설명을 참조하십시오 .


오래된 답변 :

추적 된 파일에 대한 로컬 변경 사항을 무시해야하는 경우 (구성 파일에 대한 로컬 수정 사항이 있음)을 사용하십시오 git update-index --assume-unchanged [<file>...].


8
참고로 $ GIT_DIR / info / exclude (예 : my-file.php)에 파일을 추가 한 다음 git update-index --assume-unchanged my-file.php무시하기 시작해야했습니다. 팁 고마워!
tollmanz

78
취소하기 : git update-index --no-assume-unchanged my-file.php
Ray

18
다만 명확한 설명 : 가정 - 변경합니다 (REPO에 존재)는 추적 파일입니다 ... 영업 이익이있는 경우, 비 추적 파일을 요청했다 .git/info/exclude당신은 (종종 공유 및 추적 .gitignore 오염 피하기 위해) 원하는 것입니다
dyodji을

7
stackoverflow.com/questions/23097368/ 에 따르면 이것은 안전하지 않은 것으로 간주되며 조심하지 않으면 파일이 여전히 커밋 될 수 있습니다. 이 문제에 대한 완벽한 솔루션이 아니라 성능 지원을 목적으로합니다.
danShumway

3
나는 --assume-unchanged당신의 업데이트 를 읽기 전에 돌진했다 . 나는 함께 취소 한 --no-assume-unchanged다음--skip-worktree맑은에 ... 암 I을?
Nicolas Miari

162

.gitconfig 파일의 [alias] 섹션에 다음 줄을 추가하십시오.

ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"

이제 git ignore my_file로컬 파일의 변경 사항을 무시하고 변경 사항을 무시 하는 데 사용할 수 있습니다 git unignore my_file. git ignored무시 된 파일을 나열합니다.

이 답변은 http://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.html 에서 수집되었습니다 .


1
"! git ls-files -v | grep"^ [[: lower :]] "
-Windows

3
실제 쉘을 설치하십시오 (예 : Babun은 bash 또는 zsh를 제공합니다);) 귀하의 감정을 알고 있지만 최근에는 Windows에서 Linux로 전환했으며 cmd를 다시 사용하지 않습니다.
Xerus

@Haohmaru, 항상 WSL (Linux 용 Windows 하위 시스템)을 사용할 수 있습니다.
Sz

110

몇 가지 옵션이 있습니다.

  • .gitignore작업 디렉토리에 더티 (또는 커밋되지 않은) 파일을 남겨 두십시오 (또는 topgit 또는 다른 패치 도구를 사용하여 자동으로 적용하십시오 ).
  • $GIT_DIR/info/exclude하나의 트리에만 해당되는 경우 제외를 파일 에 넣습니다 .
  • 를 실행 git config --global core.excludesfile ~/.gitignore하고 패턴을 추가하십시오 ~/.gitignore. 이 옵션은 모든 트리에서 특정 패턴을 무시하려는 경우에 적용됩니다 . 예를 들어이 파일 .pyc.pyo파일을 사용합니다 .

또한 해당되는 경우 패턴을 사용하고 파일을 명시 적으로 열거하지 않는지 확인하십시오.


10
git config --global옵션을 전역 적으로 설정 해야한다고 생각합니다 .
Josh Lee

7
실제로 .gitignore를 .gitignore;)에 추가하십시오!
도미니크 조지

68

나는 당신이 찾고 있다고 생각합니다 :

git update-index --skip-worktree FILENAME

로컬 변경 사항을 무시하는

여기에 http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/ 이 솔루션에 대한 자세한 설명이 있습니다!

사용을 취소하려면 :

git update-index --no-skip-worktree FILENAME

9
사이에 관련 논의가 --skip-worktree--assume-unchanged에서 이 SO 질문
Merwer

1
이 작업을 취소하거나 --skipworktree나중에 현재 무시되고있는 파일 / 패턴 목록을 보려면 나중에 마음을 바꾸고 파일 추적을 다시 시작해야합니까?
Anomaly

1
이것을 취소하는 방법?
user1735921

3
취소하시기 바랍니다 사용하기git update-index --no-skip-worktree <file>
user1735921

49

git 별명 을 설치 하여이 프로세스를 단순화 할 수 있습니다 . 파일 의 [alias]노드가 편집 .gitconfig됩니다.

git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'

이 설치 방법은 다음과 같습니다.

  • git ignore config.xml
    • git은 변경 사항이 보이지 않는 것처럼 가장하여 변경 사항 config.xml을 실수로 커밋하지 못하게합니다.
  • git unignore config.xml
    • git은 변경 사항에 대한 승인을 재개하여 config.xml해당 변경 사항을 다시 커밋 할 수 있습니다.
  • git ignored
    • git은 위에 설명 된 방식으로 "무시"하는 모든 파일을 나열합니다.

난을 참조하여 다음을 구축 phatmann의 대답 제시 - --assume-unchanged같은 버전을.

내가 제시하는 버전은 --skip-worktree로컬 변경을 무시 하는 데 사용 합니다. 차이점에 대한 자세한 설명은 Borealid의 답변 을 참조하십시오 . 그러나 본질적으로 개발자가 변경 내용을 커밋 할 위험없이 파일을 변경하는--skip-worktree 것이 목적입니다 .

git ignored명령은 여기에 제시된 사용 git ls-files -v하고,로 시작하는 바로 그 항목을 표시하도록 목록을 필터링 S태그를. S태그는 그의 상태이다 "worktree을 건너"파일을 나타냅니다. 표시되는 파일 상태의 전체 목록은 다음 git ls-files에 대한 -t옵션 설명서를 참조하십시오 git ls-files.


1
이 추적되지 않는 파일을 작동하지 않습니다 <(OSX에 자식 2.13.5)
테라 애슐리

'입니다!' 에 있어야 '!git ls-files -v | grep "^S"'합니까? 명령이 저와 함께 작동하지 않습니다 .. 제거하면 제대로 작동하는 것 같습니다.
Tiris

git alias 안의 느낌표는 git에게 git 부속 명령이 아닌 외부 명령 을 실행하도록 지시 합니다. 쉘 파이프 라인이 필요하기 때문에 넣었으므로 외부에서 git을 호출해야합니다. 방금 느낌표를 삭제하려고했지만 (권장 사항에 따라) 효과가 없습니다 . 나는 얻는다 . 이것은 말이된다; 느낌표없이 : git 명령을에 별칭으로 지정합니다 . Expansion of alias 'ignored' failed; 'git' is not a git commandgit git ls-files …
Birchlabs

설명 주셔서 감사합니다. 나는 자식 별칭에 익숙하지 않고 별칭을 만들기 전에 테스트하기 위해 쉘에서 실행 중이었습니다.
Tiris

이것은 훌륭한 솔루션입니다. git은 디렉토리마다 추적하므로 위의 alias를 실행할 때 git ignore <filename>해당 디렉토리에만 적용됩니다. 마지막으로 해당 파일을 변경하고 커밋하고 원격으로 푸시하려면 핸디 git unignore <filename>를 사용하여 일시적으로 다시 추적을 시작하십시오! 감사!
nickang

42

간단히 .gitignore 파일을 홈 디렉토리에 추가 할 수 있습니다 (예 : $HOME/.gitignore또는) ~/.gitignore. 그런 다음 git에게 해당 파일을 다음 명령과 함께 사용하도록 지시하십시오.

git config --global core.excludesfile ~/.gitignore

이것은 무시할 대상을 결정할 때 git이 참조하는 일반적인 .gitignore 파일입니다. 홈 디렉토리에 있기 때문에 사용자에게만 적용되며 프로젝트 .gitignore 파일을 오염시키지 않습니다.

나는이 접근법을 수년간 훌륭한 결과로 사용 해 왔습니다.


감사합니다, @EricChen. 답변을 업데이트했습니다. 시도하고 git check-ignore <file-name>확인 하는 데 사용하십시오. 그것이 당신을 위해 작동하는 경우 LMK
JESii

그것은 다음과 같이없이 ​​나를 위해 일했다 =:git config --global core.excludesfile ~/.gitignore
E. Sundin

.gitignore파일을 홈 디렉토리에 넣고 git에게 그 파일을 대신 사용하도록 지시 한 다음 로컬에서 추적 해제하려는 파일을 삭제했습니다. 그러나 변경 사항을 적용한 후 원격 저장소에서도 해당 파일을 삭제했습니다. 내가 뭐 잘못 했어요?
zyy

와우, @xyz; .gitignore로컬 디렉토리에 존재하는 파일을 무시하는 것입니다. 당신이해야 할 일은 git rm --cached저장소에서 제거하지만 지역에 남겨 두는 것입니다. 커밋 git reset --soft HEAD^을 취소하고 파일을 복구하는 것과 같은 방법으로 이전 커밋으로 돌아갈 수 있습니다. 그것은 git의 아름다움입니다 : 그것은 여전히 ​​git history에 있습니다.
JESii

2

추적되지 않은 파일이 추적되지 않는 (몇 개의) 폴더에있는 경우 특히 추적되지 않는 파일을 무시하려면 추적되지 않은 .gitignore모든 폴더에 파일을 추가 하고 한 줄 *에 새 줄을 입력하십시오 . 추적되지 않은 파일이 몇 개의 폴더에 있으면 정말 간단하고 간단한 솔루션입니다. 나에게 모든 파일은 하나의 추적되지 않은 폴더에서 vendor왔으며 위의 내용은 효과가있었습니다.


1
큰! 참고 : git은 폴더가 아닌 파일 만 추적하고 커밋 할 수 있기 때문에 작동합니다.
jmiserez

-2

리포지토리에 .gitignore 파일이없는 경우 간단한 해결책은 .gitignore 파일을 만들어 .gitignore무시할 파일 목록에 추가 하는 것입니다.


4
팀이 나중에 gitignore를 추가하기 위해 추가하고 싶다면 어떻게해야합니까? 이것도 작동합니까? 끔찍한 아이디어처럼 들리고 심지어는 작동하지 않아야 할 것 같습니다.
Bjorn

이 남자의 대답은 나를 깨뜨렸다. 아무도이 일을하지 않습니다.
Martyn Chamberlin

넣을 장소가있는 한 빠르고 간단한 해결책입니다. 우리의 저장소는 .gitignore상단에 공유 파일이 있습니다. 그러나 내 더러운 파일은 깊은 폴더에 있으므로 .gitignore옆에 내 파일을 추가 했습니다. +1
joeytwiddle 2009 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.