이미 체크인 한 디렉토리의 내용을 무시 하시겠습니까?


227

여러 프로젝트에서 사용되는 그래픽 및 사운드 파일을 보유하는 데만 사용되는 git 저장소가 있습니다. 서브 디렉토리가없는 하나의 디렉토리에 있습니다. 이제 방금 여러 레벨의 하위 디렉토리가있는 구조화 된 다른 디렉토리에서 이러한 자산을 복사하는 스크립트를 작성했습니다.

이제 (소스) 계층 파일 구조 만 git에 의해 추적되기를 원하고 (대상) 플랫 디렉토리 (하나의 파일에 모든 파일이있는)는 무시해야합니다.

대상 디렉토리를 .gitignore에 추가했지만 git은 여전히 ​​변경 사항을 추적합니다. 대상 디렉토리에서 이전 파일 삭제를 커밋하면 git이 새 내용 추적을 중지 할 수 있지만 (스크립트에서 복사 한) 것은 아닙니다.

대상 디렉토리를 잊어 버리는 방법은 무엇입니까?


어떤 디렉토리 이름이고 당신은에 .gitignore 넣어 것을
MMMMMM

1
이름은 DirNameIrrelevant이며 .gitignore에서 "DirNameIrrelevant", "DirNameIrrelevant /"및 "DirNameIrrelevant / *"를 입력하려고했습니다
Felixyz

답변:


524

이 명령은 git이 디렉토리와 그 아래의 모든 파일을 실제로 삭제하지 않고 추적을 해제하도록합니다.

git rm -r --cached <your directory>

-r옵션을 사용하면 디렉토리 아래의 모든 파일이 제거됩니다.

--cached옵션을 사용하면 파일이 작업 복사본이 아닌 git의 인덱스에서만 제거됩니다. 기본적으로 git rm <file>삭제 <file>합니다.


아 고마워 왜 이것이 필요한지 알지 못하지만 매우 유용합니다 (왜 .gitignore에 dir을 추가하기에 충분하지 않습니까?). --cached가 무엇인지 말해 줄 수 있습니까?
Felixyz

확실한. 두 가지 옵션을 설명하기 위해 답변을 수정했습니다.
Gordon Wilson

이것이 왜 필요한지에 관해서는 단지 추측 할 수 있습니다. 제작자가 프로젝트의 중요한 부분을 실수로 추적 해제 할 위험을 줄이기 위해 파일의 추적 해제를 명시 적으로 원한다고 생각합니다. 기술적 인 이유도 있다고 생각합니다.
Gordon Wilson

15
gitignore는 git이 인식 할 추적되지 않은 파일을 결정하는 데 사용됩니다. 이미 추적중인 파일과 관련이 없습니다. 사용자가 달리 무시한 파일을 추적하려면 git에서 허용합니다. 이것은 사용 add -f하거나 귀하의 상황이 될 수 있습니다. Gordon이 말했듯이 이것은 실수로 많은 파일을 지우는 것을 방지합니다. 저장소는 gitignore가 아닌 마스터 목록입니다. 또한 와일드 카드 규칙에 의해 무시 될 몇 가지 사항을 수동으로 추적 할 수 있습니다.
Cascabel

-r옵션은 "디렉토리 아래에있는 모든 파일의 제거를 원인"에없는 것이 아니라 하위 디렉토리를 통해 재귀 할 수 있습니다.
MrE

78

추적 된 파일 (체크인)이 필요하지만 파일을 로컬 저장소 및 원격 저장소에 유지하면서 파일의 추가 변경 사항을 추적하지 않으려면 다음을 수행하십시오.

git update-index --assume-unchanged path/to/file.txt

그 후에는이 파일에 대한 변경 사항이 더 이상에 표시되지 않습니다 git status.


1
OP가 디렉토리를 요구했을지도 모르지만 이것은 내가 찾던 것입니다. 하나의 체크인 파일에 대한 추가 변경 사항은 무시합니다. 감사!
sdaau

1
디렉토리를 완전히 무시하려면 'git update-index --assume-unchanged dirName / *'을 사용하십시오. 구문을 찾는 데 시간이 걸렸습니다. 여기에서 '*'가 필요합니다.
J-Dizzle

1
어떻게 이것을 뒤집을 수 있습니까?
Rhys

3
@Rhys는 그것을 뒤집을 것이다 :git update-index --no-assume-unchanged dirname/**/*
JobJob

3

blah/git에 added 라는 하위 디렉토리 의 경우 다음 두 가지 모두의 새 파일을 무시하는 것으로 보입니다 blah/. .gitignore에 추가됨 :

blah 
blah/*

1

TL; DR git 저장소를 정리하고 무시 된 모든 항목이 실제로 무시 되는지 확인하십시오 .

git rm -r --cached .
git add .
git commit -m "Clean up ignored files"

참고 : 디렉토리를 지정할 필요가 없으므로 전체 원격 저장소를 정리합니다 .

더 읽으려면 이것을 읽으십시오


0

이것이 나쁜 사람인지 아닌지 잘 모르겠지만 여기에 있습니다.

  1. *Generated*루트 .gitignore 파일에 추가 했습니다.
  2. GeneratedFile.Whatever.ext로 유지하려는 파일을 제출했습니다. 체크인
  3. 나는 이것을 수행하는 powershell 스크립트를 호출하기 위해 체크 아웃 후 git hook을 만들었습니다.

dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}

나는 나 자신에 대해 조금 나쁘게 생각하지만 실제로는 효과가 있습니다.


-2

좋아, 먼저 디렉토리가 완전히 비어있는 상태에서 체크인해야하며 (이전 파일이나 새 파일이 아닌) 이후에 추가 된 파일은 무시됩니다. 커밋하기 전에 이전 파일 추가 및 새 파일을 제거하면 새 파일은 무시해도 리포지토리에 추가됩니다.

적어도 이것은이 상황에서 나를 위해 일했습니다. 누군가 무슨 일이 일어나고 있는지 더 많은 통찰력을 제공 할 수 있다면 여전히 좋을 것입니다.


1
우리가 다른 곳에서 말한 것의 짧은 버전-gitignore는 git이 인식하지 못하는 데이터에 영향을 미칩니다. 그것은 당신이 그것에 대해 말한 데이터로 무엇을할지에 영향을 미치지 않습니다 (예 : 저장소에 추가하도록 지시).
Cascabel

따라서 추적되고 현재 삭제 된 파일은 그대로 추적해야하지만 추가 된 파일 (다음 커밋 전에 완료 된 경우)이 추적되는 반면, 내가 1 인 경우) 무시, 2) 파일 삭제, 3) 커밋, 4) 새 파일 추가, 새 파일은 추적되지 않습니다.
Felixyz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.