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.