Jak mogę usunąć plik z repozytorium Git?


1922

Dodałem plik o nazwie "file1.txt"do repozytorium Git. Następnie dokonałem tego, dodałem kilka katalogów o nazwach dir1i dir2i przekazałem je do repozytorium Git.

Teraz prąd repozytorium ma "file1.txt", dir1i dir2. Jak mogę usunąć "file1.txt"bez wpływu na innych, takich jak dir1i dir2?


85
git rmjest właściwą odpowiedzią, ale pamiętaj, że plik nadal będzie w historii. Jeśli chcesz usunąć plik, ponieważ zawierał poufne informacje, musisz zrobić coś bardziej drastycznego. (Zmiana historii, szczególnie w przypadku treści, które już opublikowałeś, jest drastycznym działaniem i należy jej unikać, jeśli to możliwe.)
Keith Thompson

8
Uwaga: w GitHub możesz teraz bezpośrednio usunąć plik z interfejsu internetowego (bez konieczności nawet klonowania repozytorium). Zobacz moją odpowiedź poniżej .
VonC

4
@KeithThompson, jakie kroki to może być, jeśli desperacko chcę to zrobić?
lessthanl0l


Odpowiedzi:


3216

Zastosowanie git rm.

Jeśli chcesz usunąć plik z repozytorium Git i systemu plików , użyj:

git rm file1.txt
git commit -m "remove file1.txt"

Ale jeśli chcesz usunąć plik tylko z repozytorium Git i nie usuwać go z systemu plików, użyj:

git rm --cached file1.txt
git commit -m "remove file1.txt"

I wcisnąć zmiany do zdalnego repo

git push origin branch_name  

91
Przydatny również: git rm -r katalog // Aby usunąć katalog i zawartość
Reg

10
Jednak nie pozbędzie się tego pliku w innych zatwierdzeniach.
VaTo

6
@ SaulOrtega: Zgadza się. Aby usunąć plik z poprzednich zatwierdzeń (zmiana wcześniejszej historii), zobacz stronę pomocy GitHub na stronie Usuwanie wrażliwych danych .
Greg Hewgill

14
Pamiętaj, że spowoduje to również usunięcie pliku lokalnie. Jeśli chcesz tylko usunąć go z repozytorium, wykonaj: git rm --cached file1.txt
Weston Ganger

5
Warto zauważyć, że jeśli plik zawierał poufne informacje (np. Poświadczenia), należy natychmiast je zmienić . Cytując GitHub „Po wysłaniu zatwierdzenia do GitHub, powinieneś rozważyć naruszenie wszelkich zawartych w nim danych. Jeśli popełniłeś hasło, zmień je! Jeśli popełniłeś klucz, wygeneruj nowy.”
c1moore

607

git rm file.txtusuwa plik z repozytorium, ale także usuwa go z lokalnego systemu plików .

Aby usunąć plik z repozytorium i nie usuwać go z lokalnego systemu plików:
git rm --cached file.txt

Poniższa dokładna sytuacja to sytuacja, w której używam git do kontroli wersji witryny mojej firmy, ale katalog „mickey” był folderem tmp do udostępniania prywatnych treści programistom CAD. Kiedy potrzebował OGROMNYCH plików, stworzyłem prywatny niepowiązany katalog i ftpd tam pliki, które mógł pobrać przez przeglądarkę. Zapominając, że to zrobiłem, później wykonałem git add -Az katalogu podstawowego witryny. Następnie git statuspokazał , że nowe pliki wymagają zatwierdzenia. Teraz musiałem je usunąć ze śledzenia i kontroli wersji gita ...

Przykładowe dane wyjściowe poniżej pochodzą z tego, co mi się przydarzyło, gdzie przypadkowo usunąłem .003plik. Na szczęście nie dbam o to, co stało się z lokalną kopią .003, ale niektóre inne obecnie zmienione pliki były aktualizacjami, które właśnie wykonałem na stronie internetowej i byłoby epickie, gdyby zostały usunięte z lokalnego systemu plików! „Lokalny system plików” = strona internetowa na żywo (nie jest to świetna praktyka, ale jest rzeczywistością) .

[~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003
error: 'shop/mickey/mtt_flange_SCN.7z.003' has local modifications
(use --cached to keep the file, or -f to force removal)
[~/www]$ git rm -f shop/mickey/mtt_flange_SCN.7z.003
rm 'shop/mickey/mtt_flange_SCN.7z.003'
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
#   modified:   shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git rm --cached shop/mickey/mtt_flange_SCN.7z.002
rm 'shop/mickey/mtt_flange_SCN.7z.002'
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.002
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
[~/www]$

Aktualizacja: Ta odpowiedź zyskuje trochę ruchu, więc pomyślałem, że wspomnę o mojej innej odpowiedzi Git, która ma kilka świetnych zasobów: Ta strona ma grafikę, która pomaga mi w odkrywaniu Git. Książka „Pro Git” jest dostępna online i bardzo mi pomaga.


6
Musisz wtedy zatwierdzić to za pomocą czegoś podobnego, git commit -m "Just removing file1.txt"a następnie, jeśli masz zdalne repozytorium, wypchnij zatwierdzenie czymś takim git push origin master.
zakaz geoinżynierii

77

Po pierwsze, jeśli używasz git rm, szczególnie w przypadku wielu plików, rozważ, że wszelkie symbole wieloznaczne zostaną rozwiązane przez powłokę, a nie przez gitpolecenie.

git rm -- *.anExtension
git commit -m "remove multiple files"

Ale jeśli plik znajduje się już w GitHub, możesz (od lipca 2013 r.) Bezpośrednio usunąć go z internetowego interfejsu GUI!

Wystarczy wyświetlić dowolny plik w repozytorium, kliknąć ikonę kosza na górze i zatwierdzić usunięcie, tak jak każdą inną edycję internetową.

Następnie „ git pull” na lokalnym repozytorium, a to lokalnie usunie plik.
Co sprawia, że ​​ta odpowiedź jest (ronda) sposobem na usunięcie pliku z git repo?
(Nie wspominając o tym, że plik na GitHub znajduje się w „git repo”)


przycisk usuwania

(zatwierdzenie będzie odzwierciedlało usunięcie tego pliku):

dokonaj usunięcia

I tak po prostu zniknęło.

Aby uzyskać pomoc dotyczącą tych funkcji, przeczytaj nasze artykuły pomocy dotyczące tworzenia , przenoszenia , zmiany nazw i usuwania plików.

Uwaga: Ponieważ jest to system kontroli wersji, Git zawsze ma swoje plecy, jeśli chcesz później odzyskać plik.

Ostatnie zdanie oznacza, że ​​usunięty plik jest nadal częścią historii i można go łatwo przywrócić (ale jeszcze nie za pośrednictwem interfejsu internetowego GitHub):

Zobacz „ Przywróć usunięty plik w repozytorium Git ”.


4
Musisz przewinąć w dół i nacisnąć „Zatwierdź zmiany”, aby zatwierdzić usunięcie!
LevinsonTechnologies

1
Nie działa to w przypadku dużych plików tekstowych. Serwer próbuje wyrenderować plik jak na zrzucie ekranu, a następnie kończy się niepowodzeniem z błędem 500.
CapeCoder

9
Ta odpowiedź dotyczy github, pytanie dotyczy repozytorium git. Nie, jak korzystać z interfejsu github.
Peter Marshall,

65

To jedyna opcja, która działała dla mnie.

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.sql'

Uwaga: Zamień * .sql na nazwę lub typ pliku. Bądź bardzo ostrożny, ponieważ przejdzie to przez wszystkie zatwierdzenia i zgra ten typ pliku.

EDYCJA: uważaj - po tym poleceniu nie będziesz w stanie pchać ani ciągnąć - zobaczysz odrzucenie „niezwiązanej historii”, możesz użyć „git push --force -u origin master” do pchania lub ciągnięcia


9
To świetna odpowiedź, ale zauważ, że w przeciwieństwie do innych odpowiedzi, to polecenie przepisuje historię zatwierdzeń i usuwa wszystkie ślady plików pasujących do wzorca. Jest to szczególnie przydatne, jeśli okazało się, że przypadkowo popełniłeś jakieś poufne informacje (i, jeśli to konieczne, możesz z powodzeniem użyć --force do przepisania historii wszelkich zdalnych repozytoriów, do których zostały one przekazane).
yoniLavi

3
To był dokładnie problem, który miałem, i zajęło mi to trochę prób i błędów, aby go naprawić. Facet, z którym pracowałem, popełnił kilka dużych zrzutów bazy danych w repozytorium, przechodząc wiele wielu zatwierdzeń. Dlatego użyłem .sql w moim przykładzie. Moje repo stało się tak rozdęte i duże, że github nie akceptował już nacisków.
Jason Glisson

3
Jeśli używasz zdalnego mistrza, musisz wymusić zatwierdzenie i przyspieszyć gogit push --force -u origin master
AlbertMarkovski

2
@AlbertMarkovski Przykro mi, ale nie byłem konkretny. Github tak naprawdę nie zaakceptowałby pushu, ponieważ repo przekroczyło limit rozmiaru. Co najmniej kilka GB. Odcięli mnie i wysłali mi e-mailem. Niestety, w tym momencie nie pomogłaby żadna siła wymuszająca push.
Jason Glisson

2
@JasonGlisson Zetknąłem się również z tym problemem polegającym na tym, że wideo zostało przypadkowo dodane do repozytorium.
AlbertMarkovski,

34

Dodatkowo, jeśli jest to folder do usunięcia i kolejne foldery lub pliki potomne, użyj:

git rm -r foldername

2
To również usunie folder z lokalnego! Use git rm --cached -r <foldername>

24

Mówiąc bardziej ogólnie, git helppomoże przy co najmniej prostych pytaniach takich jak to:

zhasper@berens:/media/Kindle/documents$ git help
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]

The most commonly used git commands are:
   add        Add file contents to the index
   :
   rm         Remove files from the working tree and from the index

6
W przypadku bardziej skomplikowanych rzeczy uważam, że są git helpmylące, ale przydają się proste rzeczy :)
James Polley

9
W rzeczywistości nie jest tak świetny dla git noobów, ponieważ „indeks” nie jest pojęciem znanym przez git noobsa. Mówię z własnego doświadczenia bycia git noobem :) Czuję też, że o wiele mniej mylące jest stwierdzenie, że rm ustawia plik do usunięcia niż usuwa z indeksu (choć dla noobów jest to nadal bez znaczenia).
Roman Starkov

Zgadzam się z romkyns: Opis „Usuń pliki z drzewa roboczego i z indeksu” nie brzmi dla mnie tak, jakby to był sposób na usunięcie pliku z repozytorium. Może lepiej zrozumiałbym git. Zamiast tego wygląda na to, że po prostu rozpakowujesz pliki (i opcjonalnie usuwasz je z działającego drzewa - czy to koniecznie wpłynie na repo?)
LarsH

14

Jeśli chcesz usunąć plik z repozytorium, ale zostaw go w systemie plików (zostanie wyśledzony):

bykov@gitserver:~/temp> git rm --cached file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"

Jeśli chcesz usunąć plik z repozytorium i z systemu plików, istnieją dwie opcje:

  1. Jeśli w pliku nie ma zmian wprowadzonych do indeksu:

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  2. Jeśli plik ma zmiany wprowadzone w indeksie:

    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    

12

git rm od tej chwili usunie tylko plik z tej gałęzi, ale pozostanie on w historii i git go zapamięta.

Właściwy sposób to zrobić git filter-branch, jak wspomnieli tu inni. Przepisze każde zatwierdzenie w historii oddziału, aby usunąć ten plik.

Ale nawet po wykonaniu tej czynności git może to zapamiętać, ponieważ mogą się do niego odnosić w dzienniku zmian, pilotach, tagach i tym podobnych.

Jeśli chcesz całkowicie zniszczyć to w jednym kroku, polecam użyć git forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

To proste, po prostu zrób git forget-blob file1.txt.

Spowoduje to usunięcie wszystkich odwołań, wykonanie git filter-branchi uruchomienie gitera, git gcaby całkowicie pozbyć się tego pliku w repozytorium.


10

Innym sposobem jest usunięcie pliku z folderu lokalnego za pomocą polecenia rm, a następnie przekazanie zmian do zdalnego serwera.

rm file1.txt

git commit -a -m "Deleting files"

git push origin master

10

Uwaga: jeśli chcesz usunąć plik tylko z git, użyj poniżej:

git rm --cached file1.txt

Jeśli chcesz usunąć również z dysku twardego:

git rm file1.txt

Jeśli chcesz usunąć folder (folder może zawierać kilka plików), powinieneś usunąć go za pomocą polecenia rekurencyjnego, jak poniżej:

git rm -r foldername

Jeśli chcesz usunąć folder w innym folderze

git rm -r parentFolder/childFolder

Następnie możesz commiti pushjak zwykle. Jeśli jednak chcesz odzyskać usunięty folder, możesz to zrobić: odzyskiwanie usuniętych plików z git jest możliwe.

Z dokumentu:

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​

OPCJE

<file>…​

Files to remove. Fileglobs (e.g. *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you

być może trzeba ich uciec. Można podać wiodącą nazwę katalogu (np. Katalog do usunięcia katalog / plik1 i katalog / plik2) w celu usunięcia wszystkich plików w katalogu i rekursywnie wszystkich podkatalogów, ale wymaga to jawnej opcji -r. -f --force

Override the up-to-date check.

-n --dry-run

Don’t actually remove any file(s). Instead, just show if they exist in the index and would otherwise be removed by the command.

-r

Allow recursive removal when a leading directory name is given.

--

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for

opcje wiersza poleceń). --cached

Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.

--ignore-unmatch

Exit with a zero status even if no files matched.

-q --quiet

git rm normally outputs one line (in the form of an rm command) for each file removed. This option suppresses that output.

Przeczytaj więcej na oficjalnym dokumencie.


7

Aby usunąć określony plik

nazwa pliku git rm

Aby wyczyścić wszystkie nieśledzone pliki z katalogu rekurencyjnie w jednym ujęciu

git clean -fdx


5

Jeśli masz aplikację GitHub dla systemu Windows, możesz usunąć plik w 5 prostych krokach:

  • Kliknij Synchronizuj.
  • Kliknij katalog, w którym znajduje się plik i wybierz najnowszą wersję pliku.
  • Kliknij na narzędzia i wybierz „Otwórz powłokę tutaj”.
  • W powłoce wpisz: „rm {nazwa pliku}” i naciśnij klawisz Enter.
  • Zatwierdź zmianę i ponownie zsynchronizuj.

5

W moim przypadku próbowałem usunąć plik na github po kilku zatwierdzeniach, ale zapisać na komputerze

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
git push --force -u origin master

a później ten plik został zignorowany


3
  1. Najpierw usuń pliki z lokalnego repozytorium.

    git rm -r Nazwa pliku

    lub usuń pliki tylko z lokalnego repozytorium, ale z systemu plików

    git rm --cached File-Name

  2. Po drugie, zatwierdzaj zmiany w lokalnym repozytorium.

    git commit -m "unwanted files or some inline comments"   
    
  3. Na koniec zaktualizuj / wypchnij lokalne zmiany do zdalnego repozytorium.

    git push 
    

czy to usunę wszystko związane z przypadkowo dodanym i wypchniętym plikiem?
bapory

1

Wypróbowałem wiele sugerowanych opcji i żadna z nich nie działała (nie wymienię różnych problemów). To, co skończyłem, to, co zadziałało, było proste i intuicyjne (dla mnie) było:

  1. przenieś całe lokalne repozytorium w inne miejsce
  2. klonuj repozytorium ponownie z master na dysk lokalny
  3. skopiuj pliki / folder z oryginalnej kopii z # 1 z powrotem do nowego klonu z # 2
  4. upewnij się, że dużego pliku, którego dotyczy problem, nie ma w pliku .gitignore lub go nie ma
  5. wykonaj zwykłe polecenie git add / git commit / git push


0

Mam pliki obj i bin, które przypadkowo znalazły się w repozytorium, że nie chcę zanieczyszczać mojej listy „zmienionych plików”

Kiedy zauważyłem, że poszli do pilota, zignorowałem je, dodając to do.gitignore

/*/obj
/*/bin

Problem polega na tym, że są już w trybie zdalnym, a kiedy się zmieniają, pojawiają się jako zmienione i zanieczyszczają listę zmienionych plików.

Aby przestać je widzieć, musisz usunąć cały folder ze zdalnego repozytorium.

W wierszu polecenia:

  1. CD do folderu repo (tj. C:\repos\MyRepo)
  2. Chcę usunąć SSIS \ obj. Wygląda na to, że możesz usunąć tylko na najwyższym poziomie, więc musisz teraz zapisać płytę CD w SSIS: (tj. C:\repos\MyRepo\SSIS)
  3. Teraz wpisz magiczną inkantację git rm -r -f obj
    • rm = usuń
    • -r = rekurencyjnie usuń
    • -f = oznacza siłę, bo naprawdę to masz na myśli
    • obj to folder
  4. Teraz biegnij git commit -m "remove obj folder"

Dostałem alarmujący komunikat, że 13 plików zostało zmienionych 315222 usunięć

Ponieważ nie chciałem szukać linii CMD, przeszedłem do Visual Sstudio i wykonałem synchronizację, aby zastosować ją do pilota


0

Jeśli chcesz usunąć pliki z określonego rozszerzenia (na przykład skompilowane pliki), możesz wykonać następujące czynności, aby usunąć je wszystkie na raz:

git remove -f *.pyc

0

Zgodnie z dokumentacją .

git rm --cached giant_file

Jeśli chodzi o wrażliwe dane - lepiej nie mówić, że usunąłeś plik, a raczej po prostu dołącz go do ostatniego znanego zatwierdzenia:

0. Zmień ostatnie zatwierdzenie

git commit --amend -CHEAD

Jeśli chcesz usunąć plik z całej historii git, zgodnie z dokumentacją powinieneś wykonać następujące czynności:

1. Usuń go z lokalnej historii

git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \  --prune-empty --tag-name-filter cat -- --all
# Replace PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA with the path to the file you want to remove, not just its filename
  1. Nie zapomnij dołączyć tego pliku do .gitignore (jeśli jest to plik, którego nigdy nie chcesz udostępniać (np. Hasła ...):
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

3. Jeśli musisz usunąć z pilota

git push origin --force --all

4. Jeśli musisz również usunąć go z wydań tagów:

git push origin --force --tags

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.