gitignore를 사용하여 파일 무시 (삭제는 아님)


97

내 자식 저장소에 tmp 디렉토리가 있지만 여전히 존재하고 싶지만 무시됩니다. 에 추가 .gitignore했지만 git status여전히 해당 디렉토리의 파일 변경 사항에 대해 알려줍니다. 시도 git rm -r --cached했지만 원격 저장소에서 제거됩니다. 이 디렉터리에 대한 변경 내용 추적을 중지하지만 여전히 존재하도록 허용하려면 어떻게해야합니까? 또한 1 개의 파일에 대해이 작업을 수행해야하지만 변경 사항은 파일을 실행 git status한 후에도 표시됩니다 .gitignore. 어떻게해야합니까?


1
.gitignore 파일이 정확히 어떻게 생겼는지 적어주세요.
kdehairy

답변:


182

대신 .gitignore다음 명령을 실행하여 로컬 git 저장소를 업데이트 할 수 있습니다.

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

이 경우 원본 저장소에서 파일을 추적하고 있습니다. 로컬 저장소에서 수정할 수 있으며 git은 변경된 것으로 표시하지 않습니다. 자세한 내용은 다음을 참조하십시오.


22
내 자식에 대한 사랑이 두 배로 늘어 났을 수도 있습니다.
Mark Fox

2
이것은 받아 들여진 대답이어야합니다. 링크 해주셔서 감사합니다.
Gowiem

4
이것을 원격 저장소로 푸시하는 방법이 있습니까?
Brian Ortiz

2
흠 난 오히려 "심지어 누군가 다른 REPO에,이 자식 파일이 아닙니다 결코 자식와 동기화"로 파일을 표시하지 않을 것이다
fantastory

11
로 되돌릴 수 있습니다 git update-index --no-assume-unchanged <file>. 나열하려면 git ls-files -v | grep '^h'.
이상현

12

파일이 존재하도록 허용하면서 파일에 대한 변경 사항을 무시하는 것이의 정확한 목적입니다 .gitignore. 따라서 파일 (또는 디렉토리)을 추가하는 .gitignore것만으로도 충분합니다.

그러나 문제는 git이 이미 무시하려는 .gitignore파일을 추적하고 추적 된 파일에 적용되지 않는다는 것입니다. 이 추적을 중지하는 유일한 방법은 git에게 제거하도록 지시하는 것입니다. 를 사용 git rm --cached하면 git이 로컬 파일을 삭제하는 것을 방지 할 수 있지만 변경 사항을받는 다른 저장소는 제거를 적용합니다. 자신의 저장소에서 그것을 피할 방법이 없다고 생각합니다. 다른 저장소에서 작업을 수행해야합니다. 그렇지 않으면 파일이 제거됩니다.

서로의 저장소에서 제거를 방지하려면 다음을 수행하십시오.

  • (분명히) 파일을 어딘가에 백업하고 변경 사항을 가져와 파일을 복원합니다.
  • 또는 변경 사항을 가져 오기 전에git rm --cached 파일을 커밋 하십시오. Git은 이미 추적되지 않은 파일을 건드리지 않고 두 제거를 멋지게 병합합니다.

6
사실 일 필요는 없습니다 ( "추적 중지 = 파일 제거"). 다음을 사용하여 파일을 repo에서 추적하고 변경 사항을 볼 수 없습니다 git update-index --assume-unchanged <file>. 보세요 : blog.pagebakers.nl/2009/01/29/…
ducin

git의 푸시 된 리포지토리에서 파일을 제거해야하므로이 git rm --cached <filename> -r 푸시가 리포지토리로 다시 변경되어 파일이 제거되므로 내 문제가 해결 되었습니다
Vinicius Cardoso

7

파일 /의 디렉토리 이름 끝에 a 를 넣으십시오..gitignore

tmp/

해당 디렉토리 내에서 파일을 추적 한 경우 먼저 git에게 파일을 잊어 버리도록 지시해야합니다 (디렉토리를 무시 목록에 추가하기 전에). 거기에 중요한 것이 없다고 가정합니다 (즉, 긁을 수 있음).

git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"

해당 디렉토리의 새 파일은 추적되지 않습니다.

--cached에 옵션 git rm인덱스에서만 작업 (다소 변경 보류). 작업 트리 또는 추적 된 항목의 상태에 영향을주지 않습니다.


나 그거있어. 둘 다 the/dir/the/dir/*
21312312

Hey Mat, 내가 무시하고 싶은 다른 폴더에 / Media와 같은 것이 있다면 가능할까요? 그럼 / 1 / Media, / 2 / Media처럼 99까지?
Nic

3

.gitignore는 추적 된 파일에 영향을주지 않습니다.

원하는 것은 tmp / 디렉토리의 파일에 변경되지 않은 가정 비트를 설정하는 것입니다. 이를 수행하는 방법에 대한 좋은 설명이 있습니다. Git : 로컬 저장소에서만 파일 추적을 해제하고 원격 저장소에 보관합니다.

또한 디렉토리의 모든 파일에 대해 변경되지 않은 가정을 설정하는 한 줄짜리 -git update-index --assume-unchanged on directory .


1

파일을 추적하고 (예 index.php:) 원격 저장소에 추가 한 다음 추적을 중지하고 파일을 원격에 유지하는 것처럼 들립니다 (예 : index.php로컬로 변경하는 동안 원격 저장소에 변경되지 않은 상태로 유지).

내가 이해하는 바에 따르면 git은 이것을 할 수 없습니다. 파일을 추적하거나 추적하지 않을 수 있습니다. 파일을 추적하면 원격 저장소에 존재하며 변경 사항을 커밋 할 때 변경됩니다. 파일을 추적하지 않으면 원격 저장소에 존재하지 않습니다.

git으로 원하는 것을 정확히 할 수 없기 때문에 정확한 상황에 따라 잠재적으로 다른 솔루션이 있습니다. 예를 들어, index.php로컬로 변경할 때 원격에서 변경 하지 않는 이유는 무엇입니까? 파일에 사용자 별 설정이 있습니까? 이 경우 다음을 수행 할 수 있습니다.

cp index.php index_template.php
git rm --cached index.php

이제 index_template.php를 원격 저장소에 표시하려는대로 편집합니다. README에 무언가를 추가하여 저장소를 사용하는 사람들에게 일단 복제하면 index_template.php를 index.php에 복사하고 필요에 맞게 편집해야한다고 알려줍니다.

git add index_template.php
git add README
git commit -m 'added template index.php file'
git push

누군가 리포지토리를 복제 할 때 자신의 index.php. 당신은 그들을 위해 쉽게 만들었습니다 : 단순히 복사 index_template.phpindex.php컴퓨터 별 설정과이를 조정한다.

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