Wie kann ich eine Datei aus einem Git-Repository löschen?

1922

Ich habe eine Datei mit dem Namen "file1.txt"Git-Repository hinzugefügt . Danach habe ich es festgeschrieben, ein paar Verzeichnisse namens dir1und hinzugefügt dir2und sie in das Git-Repository festgeschrieben.

Nun ist die aktuelle Repository hat "file1.txt", dir1und dir2. Wie kann ich löschen, "file1.txt"ohne andere zu beeinflussen, wie dir1und dir2?

webminal.org
quelle
85
git rmist die richtige Antwort, aber denken Sie daran, dass die Datei noch im Verlauf vorhanden ist. Wenn Sie eine Datei entfernen möchten, weil sie vertrauliche Informationen enthält, müssen Sie etwas drastischeres tun. (Das Ändern des Verlaufs, insbesondere für Inhalte, die Sie bereits gepusht haben, ist eine drastische Maßnahme und sollte nach Möglichkeit vermieden werden.)
Keith Thompson
8
Hinweis: Auf GitHub können Sie jetzt eine Datei direkt von der Weboberfläche löschen (ohne das Repo klonen zu müssen). Siehe meine Antwort unten .
VonC
4
@KeithThompson Welche Schritte könnten das sein, wenn ich das unbedingt tun möchte?
Lessthanl0l
5
@ lessthanl0l: stackoverflow.com/q/872565/827263
Keith Thompson
verwandte help.github.com/articles/…
Trevor Boyd Smith

Antworten:

3220

Verwenden Sie git rm.

Wenn Sie die Datei aus dem Git-Repository und dem Dateisystem entfernen möchten , verwenden Sie:

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

Wenn Sie die Datei jedoch nur aus dem Git-Repository und nicht aus dem Dateisystem entfernen möchten, verwenden Sie:

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

Und um Änderungen an Remote Repo zu pushen

git push origin branch_name  
Greg Hewgill
quelle
93
Ebenfalls praktisch: git rm -r Verzeichnis // Um ​​Verzeichnis und Inhalt zu entfernen
Reg
10
Dadurch wird diese Datei in anderen Commits jedoch nicht entfernt.
VaTo
6
@ SaulOrtega: Das stimmt. Informationen zum Entfernen einer Datei aus früheren Commits (Ändern des Verlaufs in der Vergangenheit) finden Sie auf der Hilfeseite von GitHub unter Entfernen vertraulicher Daten .
Greg Hewgill
15
Beachten Sie, dass dadurch die Datei auch lokal gelöscht wird. Wenn Sie es nur aus dem Repo löschen möchten, tun Sie Folgendes: git rm --cached file1.txt
Weston Ganger
5
Wenn diese Datei vertrauliche Informationen (z. B. Anmeldeinformationen) enthält, sollten Sie diese Anmeldeinformationen sofort ändern . So zitieren Sie GitHub: "Wenn Sie ein Commit an GitHub gesendet haben, sollten Sie alle darin enthaltenen Daten als gefährdet betrachten. Wenn Sie ein Kennwort festgeschrieben haben, ändern Sie es! Wenn Sie einen Schlüssel festgeschrieben haben, generieren Sie einen neuen."
c1moore
608

git rm file.txtEntfernt die Datei aus dem Repo, löscht sie aber auch aus dem lokalen Dateisystem .

Um die Datei aus dem Repo zu entfernen und nicht aus dem lokalen Dateisystem zu löschen, verwenden Sie:
git rm --cached file.txt

In der folgenden genauen Situation verwende ich git, um die Versionskontrolle für die Website meines Unternehmens aufrechtzuerhalten. Das Verzeichnis "mickey" war jedoch ein tmp-Ordner, um private Inhalte für einen CAD-Entwickler freizugeben. Als er RIESIGE Dateien brauchte, habe ich ein privates, nicht verknüpftes Verzeichnis erstellt und die Dateien dort per FTP gespeichert, damit er sie über den Browser abrufen kann. Ich vergaß dies und führte später eine git add -Aaus dem Basisverzeichnis der Website durch. Anschließend wurden git statusdie neuen Dateien angezeigt, die festgeschrieben werden müssen. Jetzt musste ich sie aus Git's Tracking und Versionskontrolle löschen ...

Die folgende Beispielausgabe stammt von dem, was mir gerade passiert ist, als ich die .003Datei unbeabsichtigt gelöscht habe . Zum Glück ist es mir egal, was mit der lokalen Kopie passiert ist .003, aber einige der anderen derzeit geänderten Dateien waren Updates, die ich gerade auf der Website vorgenommen habe, und es wäre episch, wenn sie im lokalen Dateisystem gelöscht worden wären! "Lokales Dateisystem" = die Live-Website (keine gute Praxis, aber Realität) .

[~/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]$

Update: Diese Antwort erhält etwas Verkehr, daher dachte ich, ich würde erwähnen, dass meine andere Git-Antwort einige großartige Ressourcen enthält: Diese Seite enthält eine Grafik, die mir dabei hilft, Git zu entmystifizieren. Das "Pro Git" Buch ist online und hilft mir sehr.

Chris K.
quelle
6
Sie müssten dies dann mit etwas wie festschreiben git commit -m "Just removing file1.txt"und dann, wenn Sie ein Remote-Repository haben, das Festschreiben mit so etwas wie pushen git push origin master.
Ban-Geoengineering
77

Wenn Sie git rminsbesondere für mehrere Dateien verwenden, sollten Sie zunächst berücksichtigen, dass ein Platzhalter von der Shell und nicht vom gitBefehl aufgelöst wird.

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

Wenn sich Ihre Datei jedoch bereits auf GitHub befindet, können Sie sie (seit Juli 2013) direkt von der Web-GUI löschen!

Zeigen Sie einfach eine beliebige Datei in Ihrem Repository an, klicken Sie oben auf das Papierkorbsymbol und übernehmen Sie das Entfernen wie bei jeder anderen webbasierten Bearbeitung.

Dann " git pull" auf Ihrem lokalen Repo, und das löscht die Datei auch lokal.
Was macht diese Antwort zu einer (Umweg-) Möglichkeit, eine Datei aus Git Repo zu löschen?
(Ganz zu schweigen davon, dass eine Datei auf GitHub ist in einem „git Repo“)


Schaltfläche zum Löschen

(Das Commit spiegelt das Löschen dieser Datei wider.):

eine Löschung festschreiben

Und einfach so, es ist weg.

Lesen Sie unsere Hilfeartikel zum Erstellen , Verschieben , Umbenennen und Löschen von Dateien , um Hilfe zu diesen Funktionen zu erhalten .

Hinweis: Da es sich um ein Versionskontrollsystem handelt, hat Git immer den Rücken frei, wenn Sie die Datei später wiederherstellen müssen.

Der letzte Satz bedeutet, dass die gelöschte Datei immer noch Teil des Verlaufs ist und Sie sie problemlos wiederherstellen können (jedoch noch nicht über die GitHub-Weboberfläche):

Siehe " Wiederherstellen einer gelöschten Datei in einem Git-Repo ".

VonC
quelle
4
Sie müssen nach unten scrollen und auf "Änderungen übernehmen" klicken, um den Löschvorgang festzuschreiben!
LevinsonTechnologies
1
Dies funktioniert nicht für große Textdateien. Der Server versucht, die Datei wie im Screenshot zu rendern und schlägt dann mit einem 500-Fehler fehl.
CapeCoder
9
Diese Antwort bezieht sich auf Github, die Frage handelt von einem Git Repo. Nicht wie man die Github-Schnittstelle benutzt.
Peter Marshall
65

Dies ist die einzige Option, die für mich funktioniert hat.

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

Hinweis: Ersetzen Sie * .sql durch Ihren Dateinamen oder Dateityp. Seien Sie sehr vorsichtig, da dies jedes Commit durchläuft und diesen Dateityp herausreißt.

BEARBEITEN: Achten Sie darauf - nach diesem Befehl können Sie nicht mehr drücken oder ziehen - Sie sehen die Ablehnung von 'nicht verwandter Verlauf'. Sie können 'git push --force -u origin master' verwenden, um zu drücken oder zu ziehen

Jason Glisson
quelle
9
Dies ist eine großartige Antwort. Beachten Sie jedoch, dass dieser Befehl im Gegensatz zu den anderen Antworten den Festschreibungsverlauf neu schreibt und alle Spuren der Dateien entfernt, die dem Muster entsprechen. Dies ist besonders nützlich, wenn Sie festgestellt haben, dass Sie versehentlich vertrauliche Informationen festgeschrieben haben (und bei Bedarf --force erfolgreich verwenden können, um den Verlauf aller Remote-Repos, auf die dies übertragen wurde, neu zu schreiben).
YoniLavi
3
Das war genau das Problem, das ich hatte, und es bedurfte einiger Versuche, um es richtig zu machen. Ein Typ, mit dem ich zusammengearbeitet habe, hatte mehrere große Datenbank-Dumps in ein Repo geschrieben, das viele, viele Commits durchlief. Deshalb habe ich in meinem Beispiel .sql verwendet. Mein Repo wurde so aufgebläht und groß, dass Github keine Stöße mehr akzeptierte.
Jason Glisson
3
Wenn Sie einen Remote-Master verwenden, müssen Sie ein Commit erzwingen und mitgit push --force -u origin master
AlbertMarkovski
2
@ AlbertMarkovski Entschuldigung, ich war nicht spezifisch. Github würde den Push eigentlich nicht akzeptieren, da das Repo über ihrer Größenbeschränkung lag. Mindestens mehrere GB. Sie haben mich abgeschnitten und mir eine E-Mail darüber geschickt. Leider würde zu diesem Zeitpunkt kein Erzwingen eines Pushs helfen.
Jason Glisson
2
@JasonGlisson Ich bin auch mit diesem Problem konfrontiert, bei dem ein Video versehentlich zu einem Repository hinzugefügt wurde.
Albert Markovski
34

Wenn es sich um einen zu entfernenden Ordner und nachfolgende untergeordnete Ordner oder Dateien handelt, verwenden Sie außerdem:

git rm -r foldername
Raja
quelle
2
Dadurch wird auch der Ordner aus dem lokalen entfernt! Use git rm --cached -r <foldername>
Achse
24

Im Allgemeinen git helphilft bei zumindest einfachen Fragen wie diesen:

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
James Polley
quelle
6
Für komplexere Dinge finde ich git helpverwirrend, aber es ist gut für die einfachen Dinge :)
James Polley
9
Es ist eigentlich nicht so toll für Git Noobs, weil "Index" kein Konzept ist, mit dem Git Noobs vertraut sind. Ich spreche aus persönlicher Erfahrung als Git-Noob :) Außerdem finde ich es viel weniger verwirrend zu sagen, dass rm eine Datei gelöscht wird, anstatt sie aus dem Index zu entfernen (obwohl sie für Noobs immer noch bedeutungslos ist).
Roman Starkov
Einverstanden mit Romkyns: Die Beschreibung "Dateien aus dem Arbeitsbaum und aus dem Index entfernen" klingt für mich nicht so, als wäre es eine Möglichkeit, die Datei aus dem Repo zu entfernen. Vielleicht würde es besser sein, wenn ich git besser verstehe. Stattdessen klingt es so, als würden Sie nur Dateien aufheben (und sie optional aus dem Arbeitsbaum entfernen - würde sich das notwendigerweise auf das Repo auswirken?)
LarsH
14

Wenn Sie die Datei aus dem Repo löschen möchten, sie aber im Dateisystem belassen möchten (wird nicht mehr verfolgt):

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

Wenn Sie die Datei aus dem Repo und aus dem Dateisystem löschen möchten, gibt es zwei Möglichkeiten:

  1. Wenn die Datei keine Änderungen im Index enthält:

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  2. Wenn die Datei Änderungen im Index enthält:

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

quelle
12

git rm wird von nun an nur noch die Datei in diesem Zweig entfernen, aber sie bleibt im Verlauf und Git wird sich daran erinnern.

Der richtige Weg ist git filter-branch, wie andere hier erwähnt haben. Jedes Commit im Verlauf des Zweigs wird neu geschrieben, um diese Datei zu löschen.

Aber auch danach kann sich git daran erinnern, weil es in Reflog, Fernbedienungen, Tags und dergleichen Verweise darauf geben kann.

Wenn Sie es in einem Schritt vollständig auslöschen möchten, empfehle ich Ihnen, es zu verwenden git forget-blob

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

Es ist einfach, mach es einfach git forget-blob file1.txt.

Dadurch werden alle Verweise entfernt, ausgeführt git filter-branchund schließlich der Git-Garbage-Collector git gcausgeführt, um diese Datei in Ihrem Repo vollständig zu entfernen .

Nachoparker
quelle
10

Eine andere Möglichkeit, wenn Sie die Datei mit dem Befehl rm aus Ihrem lokalen Ordner löschen und die Änderungen dann auf den Remote-Server übertragen möchten.

rm file1.txt

git commit -a -m "Deleting files"

git push origin master
Suhaib
quelle
10

Hinweis: Wenn Sie nur Dateien aus Git löschen möchten, verwenden Sie Folgendes:

git rm --cached file1.txt

Wenn Sie auch von der Festplatte löschen möchten:

git rm file1.txt

Wenn Sie einen Ordner entfernen möchten (der Ordner enthält möglicherweise nur wenige Dateien), sollten Sie ihn wie folgt mit dem rekursiven Befehl entfernen:

git rm -r foldername

Wenn Sie einen Ordner in einem anderen Ordner entfernen möchten

git rm -r parentFolder/childFolder

Dann können Sie commitund pushwie gewohnt. Wenn Sie jedoch gelöschte Ordner wiederherstellen möchten, können Sie folgende Schritte ausführen : Das Wiederherstellen gelöschter Dateien aus Git ist möglich.

Aus doc:

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

OPTIONEN

<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

Möglicherweise müssen sie ihnen entkommen. Ein führender Verzeichnisname (z. B. dir zum Entfernen von dir / file1 und dir / file2) kann angegeben werden, um alle Dateien im Verzeichnis und rekursiv alle Unterverzeichnisse zu entfernen. Dazu muss jedoch die Option -r explizit angegeben werden. -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

Befehlszeilenoptionen). --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.

Lesen Sie mehr über das offizielle Dokument.

Blasanka
quelle
7

So löschen Sie eine bestimmte Datei

git rm Dateiname

So entfernen Sie alle nicht verfolgten Dateien rekursiv in einem einzigen Schuss aus einem Verzeichnis

git clean -fdx

Sitesh
quelle
5

Wenn Sie die Anwendung GitHub für Windows haben, können Sie eine Datei in 5 einfachen Schritten löschen:

  • Klicken Sie auf Synchronisieren.
  • Klicken Sie auf das Verzeichnis, in dem sich die Datei befindet, und wählen Sie Ihre neueste Version der Datei aus.
  • Klicken Sie auf Werkzeuge und wählen Sie "Hier eine Shell öffnen".
  • Geben Sie in die Shell "rm {Dateiname}" ein und drücken Sie die Eingabetaste.
  • Übernehmen Sie die Änderung und synchronisieren Sie sie erneut.
jushusted
quelle
5

In meinem Fall habe ich versucht, die Datei auf Github nach wenigen Commits zu entfernen, aber auf dem Computer zu speichern

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

und später wurde diese Datei ignoriert

OlegV
quelle
3
  1. Entfernen Sie zunächst die Dateien aus dem lokalen Repository.

    git rm -r Dateiname

    oder entfernen Sie Dateien nur aus dem lokalen Repository, aber aus dem Dateisystem

    git rm - zwischengespeicherter Dateiname

  2. Zweitens: Übernehmen Sie Änderungen in das lokale Repository.

    git commit -m "unwanted files or some inline comments"   
    
  3. Schließlich aktualisieren / pushen Sie lokale Änderungen in das Remote-Repository.

    git push 
    
Ajay Kumar
quelle
Würde dies alles entfernen, was mit der versehentlich hinzugefügten und gepushen Datei zusammenhängt?
Bapors
1

Ich habe viele der vorgeschlagenen Optionen ausprobiert und keine schien zu funktionieren (ich werde die verschiedenen Probleme nicht auflisten). Was ich letztendlich tat, was funktionierte, war einfach und intuitiv (für mich):

  1. Verschieben Sie das gesamte lokale Repo an einen anderen Ort
  2. Klonen Sie das Repo erneut vom Master auf Ihr lokales Laufwerk
  3. Kopieren Sie die Dateien / Ordner von Ihrer Originalkopie in # 1 zurück in den neuen Klon von # 2
  4. Stellen Sie sicher, dass die problematische große Datei entweder nicht vorhanden oder in der Gitignore-Datei ausgeschlossen ist
  5. mache den üblichen git add / git commit / git push
Jacanterbury
quelle
1

Nachdem Sie die Datei mit aus dem Repo entfernt haben git rm, können Sie mit BFG Repo-Cleaner die Datei vollständig und einfach aus dem Repo-Verlauf löschen.

Glisu
quelle
0

Ich habe obj- und bin-Dateien, die es versehentlich in das Repo geschafft haben, dass ich meine Liste der geänderten Dateien nicht verschmutzen möchte

Nachdem ich bemerkt hatte, dass sie zur Fernbedienung gingen, ignorierte ich sie, indem ich dies hinzufügte.gitignore

/*/obj
/*/bin

Das Problem ist, dass sie sich bereits auf der Fernbedienung befinden. Wenn sie geändert werden, werden sie als geändert angezeigt und verschmutzen die Liste der geänderten Dateien.

Um sie nicht mehr zu sehen, müssen Sie den gesamten Ordner aus dem Remote-Repository löschen.

In einer Eingabeaufforderung:

  1. CD in den Repo-Ordner (dh C:\repos\MyRepo)
  2. Ich möchte SSIS \ obj löschen. Es scheint, dass Sie nur auf der obersten Ebene löschen können, daher müssen Sie jetzt eine CD in SSIS erstellen: (dh C:\repos\MyRepo\SSIS)
  3. Geben Sie nun die magische Beschwörung ein git rm -r -f obj
    • rm = entfernen
    • -r = rekursiv entfernen
    • -f = bedeutet Kraft, weil du es wirklich so meinst
    • obj ist der Ordner
  4. Jetzt renn git commit -m "remove obj folder"

Ich habe eine alarmierende Meldung erhalten, dass 13 Dateien 315222 Löschungen geändert haben

Da ich die CMD-Zeile nicht nachschlagen musste, ging ich zu Visual Sstudio und führte eine Synchronisierung durch, um sie auf die Fernbedienung anzuwenden

Nick.McDermaid
quelle
0

Wenn Sie Dateien aus einer bestimmten Erweiterung entfernen müssen (z. B. kompilierte Dateien), können Sie folgende Schritte ausführen, um alle Dateien gleichzeitig zu entfernen:

git remove -f *.pyc
Sergi Ramón
quelle
0

Laut Dokumentation .

git rm --cached giant_file

Wenn es um vertrauliche Daten geht, sagen Sie besser nicht, dass Sie die Datei entfernt haben, sondern fügen Sie sie einfach in das letzte bekannte Commit ein:

0. Letzte Festschreibung ändern

git commit --amend -CHEAD

Wenn Sie die Datei aus dem gesamten Git-Verlauf löschen möchten, sollten Sie gemäß der Dokumentation Folgendes tun:

1. Entfernen Sie es aus Ihrem lokalen Verlauf

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. Vergessen Sie nicht, diese Datei in .gitignore aufzunehmen (Wenn es sich um eine Datei handelt, die Sie niemals freigeben möchten (z. B. Kennwörter ...):
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

3. Wenn Sie von der Fernbedienung entfernen müssen

git push origin --force --all

4. Wenn Sie es auch aus Tag-Releases entfernen müssen:

git push origin --force --tags
Tomas Baran
quelle