programing

.gitignore에 나열되어 있지만 저장소에 있는 파일을 삭제하려면 어떻게 해야 합니까?

easyjava 2023. 4. 19. 23:37
반응형

.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

설명:

  1. .timeoutignore 파일을 인쇄합니다.
  2. 모든 코멘트를 인쇄물에서 삭제하다
  3. 빈 행을 모두 삭제하다
  4. 행의 선두에 'syslog rm -r'을 추가합니다.
  5. 모든 행을 실행합니다.

Git 2.32 (Q2 2021)로 수정된 무시된 디렉토리 내에서 무시된 경로를 작업하거나 표시하는 데 혼란이 있었습니다.git clean(man)

, 2021년판 답변은 다음과 같습니다.

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
  1. 리턴 「 」 : 「 」 )s/\r//를 참조해 주세요.
  2. 포함하는 코멘트」)./^#.*$/빈 「」 「」를 참조해 주세요./^\s*$/을 참조해 주세요. 「」에 해 주세요.|이며, "regex "regex", "regex"가 필요합니다.-r)-E동작합니다).
  3. :: " "/([()])/ 버전 「」을 .\\\1,\1그룹에는 이, 이 그룹에는 「일치하다」라는 가 있습니다.★★★★★★★★★★★★★★★★★★,[()] , 「」( ★★★★★★★★★★★★★★★★★」)이치노 점에 주의:gflag, 이것은 모든 괄호를 일치시킵니다(및 치환합니다).라고 고쳐 쓸 수 있다."s/(\(|\))/\\\\\1/g"당신이 그것에 관심이 있다면.
  4. " "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

반응형