.gitignore에 나열되어 있지만 저장소에 있는 파일을 삭제하려면 어떻게 해야 합니까?
내 저장소에 무시해야 할 파일이 몇 개 있어.gitignore에 추가했지만 물론 내 저장소에서 삭제되지는 않습니다.
filter-branch를 사용한 마법 명령이나 스크립트는 이력을 다시 쓰고 모든 파일을 쉽게 삭제할 수 있습니까?또는 단순히 커밋을 생성하여 이들을 삭제하는 명령어입니까?
저장소에서 수동으로 제거할 수 있습니다.
git rm --cached file1 file2 dir/file3
또는 파일이 많은 경우:
git rm --cached `git ls-files -i -c --exclude-from=.gitignore`
하지만 이것은 윈도우의 Git Bash에서는 작동하지 않는 것 같습니다.에러 메세지가 표시됩니다.다음 사항이 더 잘 작동합니다.
git ls-files -i -c --exclude-from=.gitignore | xargs git rm --cached
Windows 의 PowerShell 에서는, 이 기능이 한층 더 향상됩니다(패스나 파일명의 스페이스를 처리합니다).
git ls-files -i -c --exclude-from=.gitignore | %{git rm --cached $_}
이 파일들을 사용하지 않고 전체 역사를 다시 쓰는 것에 대해서는 자동적인 방법이 있을 수 있을지 의문입니다.
시시시시시시시시시시시는는는는는는는는는는는 : : : : : : :? :)
OS에 구애받지 않고 동작하기 쉬운 방법은
git rm -r --cached .
git add .
git commit -m "Drop files from .gitignore"
파일을 하고 다시 합니다.git add하다, 무시합니다..gitignore.
「 」의 --cached옵션을 선택하면 파일이 파일 시스템에 저장되므로 디스크에서 파일을 제거할 필요가 없습니다.
주의: 댓글에서 모든 파일의 이력을 잃게 될 것이라는 지적이 있었습니다.MacOS에서 git 2.27.0으로 테스트했는데 그렇지 않습니다.무슨 일이 일어나고 있는지 확인하려면git diff HEAD~1네 약속을 강요하기 전에 말이야
.gitignore 내의 파일은 추적되지 않기 때문에 git clean 명령을 사용하여 버전 관리 하에 있지 않은 파일을 재귀적으로 삭제할 수 있습니다.
git clean -xdn예행연습을 수행하여 제거할 항목을 확인합니다.
'아예'를 사용합니다.git clean -xdf실행할 수 있습니다.
으로는 ★★★★★★★★★★★★★★★★★」git clean -h ★★★★★★★★★★★★★★★★★」man git-clean가을 줄 것입니다
이 명령어는 스테이징 영역에 없는 새 파일도 삭제합니다.
sed로 .gitignore 스테이트먼트의 출력을 조작하는 것으로, 매우 간단한 해결 방법을 실행했습니다.
cat .gitignore | sed '/^#.*/ d' | sed '/^\s*$/ d' | sed 's/^/git rm -r /' | bash
설명:
- .timeoutignore 파일을 인쇄합니다.
- 모든 코멘트를 인쇄물에서 삭제하다
- 빈 행을 모두 삭제하다
- 행의 선두에 'syslog rm -r'을 추가합니다.
- 모든 행을 실행합니다.
Git 2.32 (Q2 2021)로 수정된 무시된 디렉토리 내에서 무시된 경로를 작업하거나 표시하는 데 혼란이 있었습니다.git clean(man)
git ls-files -i -c --exclude-from=.gitignore | xargs git rm --cached
^^
Eliza Newren()newren의 commit b548f0f, commit dd55fc0, commit a6e1b2, commit a97c7a8, commit 2e4e43a, commit b338e9f, commit 7fe1ffd, commit 7f9d87 ( 2021년 5월 12일)을 참조하십시오.
Derrick Stolee()derrickstolee의 commit 4e689d8 (2021년 5월 12일)을 참조하십시오.
(Junio C Hamano에 의해 병합 ---- 커밋 33be431, 2021년 5월 20일)
: -o 또는 -c를 지정하지 않는 한 -i에서 error out합니다
ls-files.서명자: Eliza Newren
ls-files --ignored(man) 어느 쪽과도 병용할 수 있다--others또는--cached.잠시 당황하며 코드를 파고든 후, 나는 추측했다.
ls-files -i아무것도 인쇄하지 않고 망가져 있었습니다.그리고 좋은 패치가 준비되어 있었습니다.그때 마침내 깨달았습니다.-i와 함께 사용할 수 있다--cached추적된 무시를 검색합니다.그것은 제 실수였고, 문서를 주의 깊게 읽으면 좀 더 명확하게 알 수 있었을지도 모르지만, 저는 이것이 다른 사람들도 저지를 가능성이 높은 오류라고 생각합니다.
실제로 테스트 슈트에서는 두 가지 용도 중 하나가 이 오류를 범했다고 생각합니다.
t1306.13에서는 추적 대상 파일이 없습니다.따라서 이 테스트 및 이전 테스트에서 구축되어 사용된 모든 제외는 추적되지 않은 파일에 관한 것이어야 합니다.
그러나 허무맹랑한 결과를 노리다 보니 잘못된 명령도 허무맹랑한 답을 내놓는 바람에 실수는 눈치채지 못했다.
-i대부분의 시간을 와 함께 사용하다-o그 말은 우리가 그냥 우리가 할 수 있는 건-i암시하다-o어느 한쪽이 없는 경우-o또는-c단, 이는 하위 호환성이 없는 브레이크가 됩니다.
플래그를 붙이자-i도 하지 않고-o★★★★★★★★★★★★★★★★★」-c두 개의 관련 테스트 사례를 업데이트하여 그 의도를 명시합니다.
, '아까운'이 없으면-c(Git 2.32, 2021년 2월):
fatal: ls-files -i must be used with either -o or -c
주의: 이것은 Git 2.32-rc2에서 복구되었지만 commit 2c9f1bf로 수정되었기 때문에 Junio C Hamano()gitster에 의해 commit 1df046b (2021년 5월 27일)로 수정되었습니다.
Eliza Newren()newren의 commit 906fc55(2021년 5월 27일)를 참조하십시오.
Derrick Stolee()derrickstolee의 커밋 eef8148(2021년 5월 27일)을 참조하십시오.
(커밋 329d63e, 2021년 5월 28일 Junio C Hamano에 의해 병합됨)
dir: 소개readdir_skip_dot_and_dotdot()서명자: Eliza Newren
git rm --cached -r . 것을 재귀적으로
git add ...signore에되지 않은 모든 합니다.
파일 시스템에서 실제로 삭제되지 않은 일부 삭제된 파일을 커밋해야 합니다.
하면, 「」가 .git rm --cached -r . && git add .
만약 당신이 정말로 당신의 역사를 지우고 싶다면.gitignore 파일,첫 저장 d 파일, " " " ".gitignore예: 「 」, 「 」 등)/tmp/.gitignore를 실행하다
git filter-branch --force --index-filter \
"git ls-files -i -X /tmp/.gitignore | xargs -r git rm --cached --ignore-unmatch -rf" \
--prune-empty --tag-name-filter cat -- --all
주의:
git filter-branch --index-filter.git하는은, 상대 는, 더 가 있습니다.../번째, ㅇㅇㅇㅇ는 못 요. 그리고 보아하니 당신은 이 두 가지를../.gitignore, 「」.gitignore: ../. exclude file" ( "cannot: cannot use ../.cannotore as exclude file")이git filter-branch --index-filter작업 디렉토리가 비어 있는 것으로 간주됩니까?- 이런 걸 쓰려고 했는데
git ls-files -iX <(git show $(git hash-object -w .gitignore))에, 「복사」를 ..gitignore곳에 만 해도 빈 문자열)만 해도 빈 문자열이 반환됩니다.cat <(git show $(git hash-object -w .gitignore))인쇄하다.gitignore은 역시이기 때문에 할 수 없습니다.<(git show $GITIGNORE_HASH)git filter-branch - 이 있다면
.gitignore하고 교체합니다. - 치환하다.--all마지막 줄에 이름을 붙입니다.--tag-name-filter cat제대로 수 . 수 .
리턴경우가 가 추가됩니다(를 들어 WSL의 경우 LaTeX 사용자에게 중요합니다).*.synctex(busy)를 참조해 주세요.
Scott의 솔루션에서 영감을 얻음:
cat .gitignore | sed "s/\r//" | sed -r "/^(#.*|\s*)$/d" | sed -r "s/([()])/\\\\\1/g" | sed "s/^/git rm -r /" | bash
- 리턴 「 」 : 「 」 )
s/\r//를 참조해 주세요. - 포함하는 코멘트」).
/^#.*$/빈 「」 「」를 참조해 주세요./^\s*$/을 참조해 주세요. 「」에 해 주세요.|이며, "regex "regex", "regex"가 필요합니다.-r)-E동작합니다). - :: " "
/([()])/버전 「」을 .\\\1,\1그룹에는 이, 이 그룹에는 「일치하다」라는 가 있습니다.★★★★★★★★★★★★★★★★★★,[()], 「」(★★★★★★★★★★★★★★★★★」)이치노 점에 주의:gflag, 이것은 모든 괄호를 일치시킵니다(및 치환합니다).라고 고쳐 쓸 수 있다."s/(\(|\))/\\\\\1/g"당신이 그것에 관심이 있다면. - " "
git rm -r
교환은 다음과 같습니다.s/$old/$new/$flags는 이렇게 요./$old/d 것은 .를 대체하는 입니다./^/은 .을 해서 할 수 /$/그리고 물론 제가 알기로는 bash에서 생현을 만들 수 없기 때문에 일부 캐릭터는 탈옥이 됩니다.마지막으로, 이 행은 압축할 수 있지만, 가독성을 위해 확장한 채로 두기로 했습니다.
는 누군가가 을 의심하는 것을 .sed 원숭이가 되는 이 때 수 에 좋습니다저는 이 방법이 가장 기본적이고 가장 원숭이 같은 방법이라고 생각합니다.왜냐하면 이 방법이 필요한 경우 즉시 만들 수 있기 때문입니다.그리고 정규 표현을 연습하는 것도 좋은 핑계예요.
Linux 에서는 다음 명령을 사용할 수 있습니다.
를 들어, 저는 삭제하려고 .*.py~그래서 내 명령은 ==>일 것입니다.
find . -name "*.py~" -exec rm -f {} \;
git는 .gitignore에 추가한 후 .gitignore 패턴과 일치하는 파일을 무시합니다.
그러나 저장소에 이미 있는 파일은 그대로 유지됩니다.
git rm files_ignored; git commit -m 'rm no use files'무시된 파일을 삭제합니다.
언급URL : https://stackoverflow.com/questions/13541615/how-to-remove-files-that-are-listed-in-the-gitignore-but-still-on-the-repositor
'programing' 카테고리의 다른 글
| Dockerfile에서 도커 컨테이너의 Bash 별칭을 설정하려면 어떻게 해야 합니까? (0) | 2023.04.19 |
|---|---|
| Git 브랜치를 로컬 및 원격으로 삭제하려면 어떻게 해야 합니까? (0) | 2023.04.19 |
| CSS 배경 확장 및 확장 (0) | 2023.04.19 |
| 스칼라: 반복할 수 있는 현악기에 합류하다 (0) | 2023.04.19 |
| 같은 회선상에서 에코를 표시 및 갱신하는 방법 (0) | 2023.04.19 |