로컬 파일 시스템에서 파일을 삭제하지 않고 Git 저장소에서 파일을 제거하십시오.


3044

초기 커밋에 일부 로그 파일이 포함되었습니다. 내가 추가 한 *log내에 .gitignore, 지금은 내 저장소에서 로그 파일을 제거 할.

git rm mylogfile.log

리포지토리에서 파일을 제거하지만 로컬 파일 시스템에서도 파일을 제거합니다.

파일의 로컬 사본을 삭제 하지 않고 리포지토리에서이 파일을 제거하려면 어떻게 해야합니까?



14
가장 많이 찬성 된 답변이 일부에게는 위험하다는 점은 주목할 가치가 있습니다. 당신은 당신의 지역의 다음 풀 당신이 자식에서 제거 다른 곳에서 해당 파일을 누르면보다 원격 REPO를 사용하는 경우에만 삭제됩니다 . 이것은 답글 중 하나에서 언급되었지만 언급되지 않았습니다.
RichieHH

답변:


4349

로부터 사람 파일 :

제공되면 --cached준비된 콘텐츠는 분기의 끝 또는 디스크의 파일과 일치해야 파일을 인덱스에서 제거 할 수 있습니다.

따라서 단일 파일의 경우 :

git rm --cached mylogfile.log

단일 디렉토리의 경우 :

git rm --cached -r mydirectory

151
그것만큼 자명하지 않기 때문에 쉽게 놓쳤다 svn rm --keep-local.
Martin

114
그러나 원격 서버의 파일을 어떻게 보존합니까? 이렇게하면 로컬 서버가 유지되지만 다른 서버에서 밀고 당기면 파일이 삭제됩니다. 또한 파일에 .gitignore를 추가했지만 여전히 제거됩니다.
spankmaster79

6
에이 여전히 파일을 제거 git pull하면 뒤에있는 경우가 후에 커밋git rm
페트르 펠러

9
대답에서 명령을 실행 한 후에는 git commit -m "Commit message"및 을 사용해야 git push합니다. 다른 단계적 변경 사항이있는 경우 (로 확인 git status)이 시점에도 적용됩니다.
Sinjai

9
이것은 가장 받아 들여지는 대답이며하지 않는 것이므로 요청한 내용을 알려 드리겠습니다. 명령을 사용하고 git rm --cached mylogfile.log저장소에서 파일을 삭제합니다. 생산적인 시스템에서 파일을 잃지 않으려면 파일을 백업하고이 파일을 가져옵니다. 앞에서 언급 한대로 파일이 삭제되므로 백업에서 다시 복사해야합니다. 이것은 상당히 고통 스럽지만이 문제에 대한 더 나은 해결책을 찾지 못했습니다.
Marcel Grolms

275

Resharper 파일과 같이 리포지토리에서 전체 폴더를 제거하려면 다음과 같이하십시오.

git rm -r --cached folderName

나는 좀 더 선명한 파일을 커밋했으며 다른 프로젝트 사용자에게 유지하기를 원하지 않았습니다.


13
향후 방문자를위한 추가 참고 사항 : GUI를 사용하여 커밋을 다시 저장소에 "동기화"하지 마십시오. 그러면 파일이 로컬 리포지토리로 다시 내려갑니다. Git Push repo branch실제로 리모콘에서 파일을 제거하려면 을 수행해야합니다 .
RubberDuck

211

로컬 파일 시스템에서 파일을 삭제하지 않고 .gitignore를 기반으로 저장소에서 파일을 제거 할 수도 있습니다.

git rm --cached `git ls-files -i -X .gitignore`

또는 Windows Powershell에서 다음을 수행하십시오.

git rm --cached $(git ls-files -i -X .gitignore)

7
Windows에서는 작동하지 않습니다. git ls-files -i -X ​​.gitignore 작동하지만 파일을 'git rm'에 보내는 방법을 모르겠습니다. 그렇게하는 방법을 알고 있습니까?
Erik Z

17
Windows에서 작품 대신 cmd를 콘솔의 망할 놈의 배쉬 사용하는 경우
안드레아스 지타

17
이거 너무 좋아. 파일 이름에 공백이있는 파일이 있다는 점을 제외하고는 효과가있었습니다. 여기에 솔루션을 수정했습니다 git ls-files -i -X .gitignore | xargs -I{} git rm --cached "{}". 이 솔루션은 다음과 같은 훌륭한 도구이므로 여기에 답을 추가하거나 수정하십시오.
mpettis

나는 시도하지 않았지만 .gitkeep저장소에서 빈 폴더를 보존하는 것과 같은 파일도 제거 합니다. 예 : .gitignore폴더를 포함 uploads하고 repo는를 추적해야합니다 .gitkeep. 그 아래의 저장소에서 모두 uploads제거하면 또한 제거 .gitkeep됩니다.
Vladimir Vukanac

이 제안은 powershell에서 완벽하게 작동했습니다 : git rm --cached $ (git ls-files -i -X ​​.gitignore)
geekandglitter

89

내 대답에 따라 여기 : https : //.com/questions/6313126/how-to-remove-a-directory-in-my-github-repository

로컬이 아닌 git 저장소에서만 폴더 / 디렉토리 또는 파일을 제거하려면 간단한 3 단계를 시도하십시오.


디렉토리를 제거하는 단계

git rm -r --cached File-or-FolderName
git commit -m "Removed folder from repository"
git push origin master

다음 커밋에서 해당 폴더를 무시하는 단계

다음 커밋에서 해당 폴더를 무시하려면 .gitignore 라는 루트에 하나의 파일을 만들고 해당 폴더 이름을 넣으십시오. 원하는만큼 넣을 수 있습니다

.gitignore 파일은 다음과 같습니다

/FolderName

디렉토리를 제거


@gaurav는 그것이 기뻤습니다!
eirenaios

69

또한 민감한 데이터 (예 : 비밀번호가 포함 된 파일)를 커밋 한 경우 리포지토리 기록에서 완전히 삭제해야합니다. 이를 수행하는 방법을 설명하는 가이드는 다음과 같습니다. http://help.github.com/remove-sensitive-data/


13
이 답변에는 다른 웹 사이트에 연결하는 대신이 작업을 완료하는 데 필요한 명령이 포함되어야합니다.
Florian Lemaitre

1
또한 git bfg repo cleaner 도구를 사용하는 것이 더 쉽고 빠릅니다.
Lubed Up Slug

64

보다 일반적인 해결책 :

  1. .gitignore파일을 편집 하십시오.

    ECHO mylogfile.log >> .gitignore

  2. 색인에서 모든 항목을 제거하십시오.

    git rm -r -f --cached .

  3. 인덱스를 다시 작성하십시오.

    git add .

  4. 새로운 커밋 만들기

    git commit -m "Removed mylogfile.log"


2
실제로 파일이 삭제됩니까?
Mr_and_Mrs_D

6
GitHub에서? 아니. 이미 github으로 푸시 한 경우 사이트에서 제거하지 않습니다. 그러나 로컬 자식 저장소를 업데이트합니다.
mAsT3RpEE

5
삭제 한 주석은 실제로 더 많이 제거되었습니다. :) 솔루션의 문제 rm --cashed는 파일을 가져 오면 결국 파일을 삭제한다는 것입니다. 그리고 이것은 사람들이 " 로컬 파일 시스템에서 파일을 삭제하지 않고 저장소에서 파일을 제거합니다"라고 말할 때 원하는 것이 아닙니다 . 이제 왜 위의 해결책이 저를 넘어서게 되었습니까? 아마 OP가 혼자 일하고 결코 풀리지 않았습니까? 던노 문제 OFC "항상 밀려 일단"내가 github의 이해
Mr_and_Mrs_D

github 자체에 요청하지 않으면 100 % 솔루션이 있다고 생각하지 않습니다. 지금은 이것에 충실하십시오. 파일 복사, gitignore에 추가, 실제 git rm -r, 커밋, 푸시, 파일 복원을 수행하십시오. 다른 솔루션을 찾으셨습니까?
mAsT3RpEE

9
내 문제는 github가 아닙니다 . 파일을 가져 오면 실제로 파일이 동료에서 삭제됩니다 . 나는 하지 않는 파일을 삭제하고 싶습니다. 이것은 과거에 큰 문제를 일으켰습니다. 그래서 실제로 파일을 삭제 하지 않는 솔루션이 있는지 궁금 합니다. 주석 여관을 또한 허용 대답을 참조하십시오 stackoverflow.com/questions/1143796/...
Mr_and_Mrs_D

24

힘내 당신이 파일을 변경하지 않은 것으로 가정하여 해당 파일을 무시할 수 있습니다. 이것은 git update-index --assume-unchanged path/to/file.txt명령 을 실행하여 수행됩니다 . 파일을 그렇게 표시하면 git은 해당 파일의 변경 사항을 완전히 무시합니다. git status 또는 git diff를 실행할 때 표시되지 않으며 커밋되지 않습니다.

( https://help.github.com/articles/ignoring-files에서 )

따라서 삭제하지 않고 변경 사항을 영원히 무시합니다. 나는 이것이 로컬에서만 작동한다고 생각하므로 동료는 위와 동일한 명령을 실행하지 않으면 변경 사항을 계속 볼 수 있습니다. (여전히이를 확인해야합니다.)

참고 : 이것은 질문에 직접 대답하는 것이 아니라 다른 답변의 의견에 대한 후속 질문을 기반으로합니다.


2
흠, 나는 이것을하지만 다른 누군가가 repo에서 파일을 변경하면 파일을 덮어 쓸 수 있음을 알았습니다.
AlxVallejo

17

파일을 추적 해제하고 로컬 및 원격 저장소에서 삭제하지 않으려면 thhis 명령을 사용하십시오.

git update-index --assume-unchanged  file_name_with_path

2
이것은 좋은 대답이지만, 사람들이 일반적으로 Git과 함께 그 단어를 사용한다는 의미에서 파일을 "추적 해제"하지 않는다는 점에 유의해야합니다. . 이 답변은 파일을 리포지토리에 보관하지만 Git이 파일이 변경되었음을 알지 못하게합니다. 그것은 중요한 차이점이 있습니다. 가장 중요한 것은 파일이 여전히 다른 사람을 위해 존재하고 누군가 다른 사람이 파일을 변경하고 당기면 확인없이 로컬 복사본을 덮어 쓸 수 있습니다.
Soren Bjornstad

8

위의 답변은 저에게 효과적이지 않았습니다. 내가 사용하는 filter-branch커밋 된 모든 파일을 제거 할 수 있습니다.

다음을 사용하여 git 저장소에서 파일을 제거하십시오.

git filter-branch --tree-filter 'rm  file'

다음을 사용하여 git 저장소에서 폴더를 제거하십시오.

git filter-branch --tree-filter 'rm -rf directory'

모든 커밋에서 디렉토리 또는 파일이 제거됩니다.

다음을 사용하여 커밋을 지정할 수 있습니다.

git filter-branch --tree-filter 'rm -rf directory' HEAD

또는 범위 :

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD

모든 것을 원격으로 푸시하려면 다음을 수행하십시오.

git push origin master --force

2
이것과 결합 git rm -r --cached NAME하여 로컬 git repo에서 제거하고 나중에 가져 오는 사람 (git에서 파일 또는 디렉토리 기록을 삭제하여)에 영향을 미치지 않도록하는 트릭입니다.
notbad.jpeg

1
이것은 git history를 다시 작성하므로 --force after를 푸시해야합니다. 이것은 내가 추측 한 질문에서 범위를 벗어났습니다. 유명한 유명한 리포지토리에서는 이미 리포지토리를 복제 한 모든 사람이 당길 때 문제가 발생하는 것처럼 히스토리 라인을 변경할 수 없습니다.
기 illa 페로

0

파일을 무시하고 git에서 파일을 제거하고 git을 업데이트하십시오 (제거를 위해).

참고 : 민감한 정보에 대한 기록은 다루지 않습니다.

이 과정은 git에서 무슨 일이 일어나고 있는지 확실하게 이해합니다. 시간이 지남에 따라 나는 다음과 같은 프로세스를 수행하는 법을 배웠습니다.

1) 파일 무시

  • 프로젝트 .gitignore를 추가하거나 업데이트하여 무시하십시오. 예를 들어 부모 디렉토리와 같은 많은 경우 log/에는 정규 표현식이 사용됩니다.
  • 해당 .gitignore파일 변경을 커밋하고 푸시합니다 (푸시가 필요한지 확실하지 않은 경우, 해를 끼치 지 않음).

2) git에서 파일을 제거하십시오 (전용).

  • 이제 git에서 파일을 제거하십시오 (전용). git remove --cached some_dir/
  • 그들이 여전히 로컬에 남아 있는지 확인하십시오 (그들은해야합니다!).

3) 해당 변경 사항을 추가하고 커미트하십시오 (실질적으로 혼동되는 "add"명령에도 불구하고 이는 내용을 삭제하는 "add"에 대한 변경 사항입니다!)

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