Git이 지정된 파일을 무시하지 않는 이유는 무엇입니까?


195

나는 다음 줄을 추가했다 .gitignore:

sites/default/settings.php

그러나 입력 git status하면 파일이 준비되지 않은 파일로 표시됩니다.

뭐가 문제 야? 다른 모든 패턴은 잘 작동합니다.



나는 같은 문제가 있었고, 대신 .gitignore 파일을 다른 드라이브에 저장했다는 것을 발견했다. face-palm :
Henry Chan

저장소에 물건을 보관하고 변경 사항을 무시하는 것은 매우 나쁜 생각입니다.
Yevgeniy Afanasyev 1

답변:


370

사용자 .gitignore가 작업 디렉토리의 루트에 있는지 확인하고 해당 디렉토리 에서 상태 출력에서 ​​파일의 경로를 실행 git status하고 복사 하여에 붙여 넣으십시오 .gitignore.

그래도 작동하지 않으면 파일이 이미 Git에 의해 추적되었을 수 있습니다. 의 출력을 통해이를 확인할 수 있습니다 git status. 파일이 "추적되지 않은 파일" 섹션에 나열되어 있지 않으면 Git에서 이미 추적 한 것이므로 .gitignore파일 의 규칙을 무시 합니다.

Git에서 파일을 무시하는 이유는 파일이 저장소에 추가되지 않기 때문입니다. 이전에 무시하려는 파일을 추가 한 경우 Git에서 해당 파일을 추적하고 해당 파일과 일치하는 무시 규칙을 건너 뜁니다. 파일이 이미 리포지토리의 일부이므로 Git이이를 수행합니다.

실제로 파일을 무시하려면 파일을 추적 해제하고 리포지토리에서 제거해야합니다. 를 사용하여 그렇게 할 수 있습니다 git rm --cached sites/default/settings.php. 이렇게하면 파일을 실제로 삭제하지 않고 리포지토리에서 파일이 제거됩니다 --cached. 변경 사항을 커밋하면 파일이 리포지토리에서 제거되며 무시해도 제대로 작동합니다.


'작업 디렉토리의 루트'는 무엇을 의미합니까? '.git'저장소가있는 디렉토리는 무엇입니까?
Jonathan Leffler

작업 디렉토리는 .git디렉토리가 위치한 디렉토리이며 그 자체가 저장소의 루트입니다. 당신이 저장소를 복제 할 때와 마찬가지로 /xy/다음 /xy/과 작업 디렉토리입니다 /xy/.git/내부.
찌를

3
때로는 인덱스를 올바르게 다시 작성하기 위해 git add .나중에 작업을 수행해야 할 수도 있습니다 git rm --cached.
Cooper

자식 상태에서 확인하는 아이디어는 훌륭했습니다. 나는 Eclipse의 Git Staging에서 계속 확인했고 경로가 잘못되었습니다. 감사!
walla

1
중첩 된 폴더도 체크인 했으므로 -r (재귀 적) 플래그를 추가해야했습니다. 내 경우에는 git 폴더의 루트로 이동 한 다음 git rm --cached -r .vs / 명령을 실행했습니다. 여기서 vs는 추적에서 제거하려는 최상위 폴더입니다.
Devology Ltd

106

나는 이것에 부딪쳤다. 오래된 질문이지만, 그 파일을 추적하고 싶지만 특정 작업 복사본에서 추적하지 않기를 원한다.

git update-index --assume-unchanged sites/default/settings.php

5
그것이 실제로 내가 찾던 대답입니다. 다른 모든 답변은 파일이 git add로 추가되었다고 가정합니다. 항상 그런 것은 아닙니다. Acquia Cloud를 사용하면 .gitignore 파일은 settings.php (예 :)를 무시하지만 파일은 첫 번째 커밋에 포함됩니다. 파일을 추적 해제하면 리포지토리에서 파일이 삭제되므로 라이브 사이트에서 파일이 삭제됩니다.
PatrickS

나도 도와 줘-고마워! 투표함. 로컬 git repo에만 적용되고 원격으로 푸시되어 다른 개발자가 복제 한 후에도 지속되지 않을 것이라고 생각합니까?
Ivan

1
예, 지역에만 있습니다.
Mescalito

41

.gitignore는 아직 저장소에 추가하지 않은 파일 만 무시합니다.

git add .하고 파일이 색인에 추가되면 .gitignore가 도움이되지 않습니다. 당신은 수행해야합니다 git rm sites/default/settings.php제거하고, 다음은 무시됩니다.


thanks. 그러나 작업 디렉토리가 아닌 색인에서만 파일을 제거하는 방법은 무엇입니까?
Nick.h

1
git rm그렇게해야하지만 작업 디렉토리에서 제거하는 -f 옵션을 사용해야 할 수도 있습니다. 나는 파일의 복사본을 만들고 복사 git rm -f한 다음 복원하는 것 외에는 이것을 알아 내지 못했습니다 .
jonescb

똑같아 어딘가에 복사본을 만들고, 제거하고, 제거 된 상태를 커밋하고, 파일을 다시 추가하고 파일이 어떻게 무시되는지 확인하십시오.
Yevgeniy Afanasyev 1

18

이 명령을 사용하십시오

git rm -rf --cached .
git add .

때로는 .gitignore 파일이 정확하더라도 작동하지 않습니다. Git이 파일을 무시하는 이유는 파일이 저장소에 추가되지 않기 때문입니다. 이전에 무시하려는 파일을 추가 한 경우 Git에서 해당 파일을 추적하고 건너 뛰는 일치 규칙을 건너 뜁니다. 파일이 이미 리포지토리의 일부이므로 Git이이를 수행합니다.


12

나는 같은 문제가 있었다. .gitingore실행시 추적되지 않은 파일로 나열된 위치에 정의 된 파일 git status.

.gitignore파일이 UTF-16LE인코딩이 아닌 인코딩 으로 저장 되었기 때문 UTF8입니다.

.gitignore파일 인코딩을 변경 한 후에 UTF8나에게 도움이되었습니다.


나는 윈도우를 댕 ... 이것 때문에 멍청한 놈 같은 느낌
코티 엠브리

왜 파일 인코딩이 중요한지 아십니까? 경로를 제대로 읽지 못했을까요?
Chargnn

2

settings.php 파일을 성공적으로 무시하기 위해 내가 한 일 :

  1. git rm-캐시 된 사이트 /default/settings.php
  2. 커밋 (여기까지 작동하지 않았습니다)
  3. 수동으로 삭제 된 sites / default / settings.php (이 트릭을 수행했습니다)
  4. git add.
  5. 커밋 (성공적으로 무시)

Git에 커밋 된 파일이 있으면 무시가 예상대로 작동하지 않는다고 생각합니다. 파일을 삭제하고 커밋하십시오. 이후에는 무시됩니다.


2

응용 프로그램 구성 파일과 같은 인스턴스가 있는데 git에서 추적하려고하지만 .gitignore가 작동하지 않지만 로컬 설정을 변경해야합니다. git 이이 파일을 관리하거나 수정 된 것으로 표시하고 싶지 않습니다. 이를 위해 skip-worktree를 사용합니다.

git update-index --skip-worktree path/to/file

파일을 나열하고 S로 시작하는 줄을 건너 뛰어 확인하여 파일을 건너 뛴 것을 확인할 수 있습니다.

git ls-files -v | grep ^S

나중에 파일을 로컬에서 다시 관리하려면 git을 실행하십시오.

 git update-index --no-skip-worktree path/to/file

위의 Mescalito는 훌륭한 답변을 얻었습니다.

git update-index-변경되지 않은 파일 가정 / to / ignore.php

git와 계약을 맺은 사용자는 : 파일을 변경하지 말 것을 약속하고 Git이 작업 트리 파일이 색인에 기록 된 것과 일치한다고 가정 할 수 있습니다.

그러나 파일의 내용을 변경하므로 제 경우에는 --skip-worktree가 더 좋습니다.

Toshiharu Nishina의 웹 사이트는 skip-worktree와 변경되지 않은 것으로 가정 한 훌륭한 설명을 제공했습니다. 로컬에서 이미 Git으로 관리되는 파일 무시


2

또 다른 가능한 이유동시에 실행되는 몇몇 git 클라이언트 인스턴스 . 예를 들어 "git shell"+ "GitHub Desktop"등


이것은 나에게 일어났다. 나는 주 클라이언트로 "GitHub Desktop"을 사용하고 있었고 새로운 .gitignore 설정을 무시하고 있었다 : commit 후 commit :

  1. 당신은 무언가를 저지 릅니다.
  2. 커밋 : .gitignore 설정을 무시합니다. 커밋에는 .gitignore에 언급 된 많은 임시 파일이 포함되어 있습니다.
  3. 자식 캐시를 지우십시오. .gitignore가 UTF8인지 확인하십시오. 파일 제거-> 커밋-> 파일을 다시 이동하십시오. 1 커밋을 건너 뛰십시오. 도움이되지 않습니다.

이유 : Visual Studio Code 편집기가 동일한 열린 리포지토리와 함께 백그라운드에서 실행 중입니다. VS 코드에는 git 컨트롤이 내장되어있어 약간의 충돌이 발생합니다.

해결 방법 : 숨겨진 숨겨진 자식 클라이언트를 여러 번 확인하고 특히 자식 캐시를 지우는 동안 한 번에 하나의 자식 클라이언트 만 사용하십시오.


1

.gitignore에 확장자가 없는지 확인하십시오 !! .gitignore.txt가 될 수 없으며 Windows에서는 파일 이름을 .gitignore로 지정하십시오. 작동합니다.


0

방금 git 1.7.3.1로 이것을 시도하고 다음과 같은 구조가 주어졌습니다.

repo/.git/
repo/.gitignore
repo/sites/default/settings.php

곳에 repo따라서 위에서 언급 한 "루트"이다 (나는 당신의 작업 트리의 루트를 부를 것이다), 그리고 .gitignore에만 포함 sites/default/settings.php(가) 나를 위해 일을 무시 (그리고 여부를 중요하지 않습니다, .gitignoreREPO 여부에 추가됩니다). 이 레포 레이아웃과 일치합니까? 그렇지 않다면 무엇이 다릅니 까?


예. 그것은 정확히 당신과 동일하지만 작동하지 않습니다. 다른 모든 패턴이 작동합니다. 문제가 확실히 settings.php 폴더와 관련이 있다고 말했습니다.
Nick.h

나는 저장소에 물건을 보관하고 변경 사항을 무시하는 것이 매우 나쁜 생각이라고 생각합니다.
Yevgeniy Afanasyev 1

@YevgeniyAfanasyev 컴파일 출력, IDE 사용자 설정, 툴체인에 의해 생성 된 다른 모든 임시 파일 등을 제외하고…
Chris F Carroll

프로젝트 폴더에있는 파일뿐만 아니라 저장소에 계속 커밋되었습니다. 왜 저장소에 임시 파일이 필요합니까?
예브게니 아파 나시 예프

0

미래의 누군가가 내가했던 것과 같은 문제가있는 경우를 대비하여 :

당신이 사용하는 경우

*
!/**/
!*.*

확장명이없는 바이너리 파일을 제거하려면 다른 모든 gitignore 행이 아래에 있는지 확인하십시오. Git은 .gitignore에서 맨 위에서 읽으므로 gitignore에 'test.go'가 있었지만 파일에서 첫 번째 파일이었고 이후 'ungnored'되었습니다.

!*.*

0

VS 코드 터미널에서 위의 대부분의 명령을 시도했지만 다음과 같은 오류가 발생했습니다.

fatal: pathspec '[dir]/[file]' did not match any files

GitHub Desktop에서 프로젝트를 열었고 무시했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.