Entfernen Sie das Verzeichnis aus dem Remote-Repository, nachdem Sie es zu .gitignore hinzugefügt haben

599

Ich habe ein Verzeichnis festgeschrieben und an github gesendet. Danach habe ich die .gitignoreDatei geändert und ein Verzeichnis hinzugefügt, das ignoriert werden sollte. Alles funktioniert gut, aber das (jetzt ignorierte) Verzeichnis bleibt auf Github.

Wie lösche ich dieses Verzeichnis aus Github und dem Repository-Verlauf?

janw
quelle

Antworten:

1067

Die Regeln in Ihrer .gitignoreDatei gelten nur für nicht verfolgte Dateien. Da die Dateien unter diesem Verzeichnis bereits in Ihrem Repository festgeschrieben wurden, müssen Sie sie entfernen, ein Festschreiben erstellen und an GitHub senden:

git rm -r --cached some-directory
git commit -m 'Remove the now ignored directory "some-directory"'
git push origin master

Sie können die Datei nicht aus Ihrem Verlauf löschen, ohne den Verlauf Ihres Repositorys neu zu schreiben. Sie sollten dies nicht tun, wenn andere Personen mit Ihrem Repository arbeiten oder es von mehreren Computern aus verwenden. Wenn Sie dies dennoch tun möchten, können Sie git filter-branchden Verlauf neu schreiben. Hier finden Sie eine hilfreiche Anleitung dazu .

Beachten Sie außerdem, dass die Ausgabe von git rm -r --cached some-directoryungefähr so ​​lautet:

rm 'some-directory/product/cache/1/small_image/130x130/small_image.jpg'
rm 'some-directory/product/cache/1/small_image/135x/small_image.jpg'
rm 'some-directory/.htaccess'
rm 'some-directory/logo.jpg'

Das rmist Feedback von Git über das Repository; Die Dateien befinden sich noch im Arbeitsverzeichnis.

Mark Longair
quelle
3
Wenn jemand anderes zieht, werden die jetzt ignorierten Dateien für ihn gelöscht oder bleiben unberührt?
Martin Konicek
3
@ Martin Konicek: Wenn der Benutzer, der diese Änderungen abruft, keine Änderungen an diesen Dateien vorgenommen hat, werden sie entfernt.
Mark Longair
@ MarkLongair Was macht -rund --cached. Vielen Dank.
Labanino
13
@ Labanino: -rbedeutet rekursiv, notwendig, wenn Sie ganze Verzeichnisse erstellen . --cachedÜberschreibt das normale Verhalten von git, sie aus dem Arbeitsverzeichnis zu löschen und das Löschen zum Festschreiben bereitzustellen, und lässt git nur in dem Bereitstellungsbereich arbeiten, der zum Festschreiben bereit ist. Auf diese Weise teilen Sie git mit, dass Sie Ihre lokalen Kopien der Dateien behalten möchten.
Entheh
2
Das funktioniert gut, aber ich musste es zuerst tun: git reset name_of_filedamit das, was oben beschrieben wurde, funktioniert
Edvard Haugland
248

Ich mache das:

git rm --cached `git ls-files -i --exclude-from=.gitignore` 
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

Dadurch werden alle Dateien / Ordner, die in Ihrem Git enthalten sind, ignoriert und Sie müssen sie nicht manuell auswählen


Das scheint für mich aufgehört zu haben, das tue ich jetzt:

 git rm -r --cached . 
 git add .
 git commit -m 'Removed all files that are in the .gitignore' 
 git push origin master
Blundell
quelle
4
Danke, das hat mir sehr geholfen! Wenn Sie Windows Powershell verwenden, können Sie dies tunforeach ($i in iex 'git ls-files -i --exclude-from=.gitignore') { git rm --cached $i }
Matthew
10
Versuchte Ihren zweiten Ansatz, es entfernte alle Dateien von meinem lokalen Git!
Artnikpro
2
Ich denke, Sie sollten zum Unterverzeichnis navigieren und es tun. Korrigiere mich, wenn ich falsch liege.
Was haben wir heute gelernt, Kinder? "Führen Sie keinen zufälligen Code aus, den Sie bei Stack Overflow finden!"
Jonathan Landrum
49

Gemäß meiner Antwort hier: Wie entferne ich ein Verzeichnis aus dem Git-Repository?

Um Ordner / Verzeichnis nur aus dem Git-Repository und nicht aus dem lokalen zu entfernen, versuchen Sie 3 einfache Schritte.


Schritte zum Entfernen des Verzeichnisses

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

Schritte zum Ignorieren dieses Ordners bei den nächsten Commits

Um diesen Ordner bei den nächsten Commits zu ignorieren, erstellen Sie eine Datei im Stammverzeichnis mit dem Namen .gitignore und fügen Sie diesen Ordnernamen ein . Sie können so viele setzen, wie Sie möchten

Die .gitignore- Datei sieht folgendermaßen aus

/FolderName

Verzeichnis entfernen

Eirenaios
quelle
1
Genau das habe ich gesucht. Danke :)
Rohit Singh
Ich bin froh, dass es @Rohit Singh geholfen hat
eirenaios
9

Blundells erste Antwort hat bei mir nicht funktioniert. Es hat mir jedoch den richtigen Weg gezeigt. Ich habe das Gleiche getan:

> for i in `git ls-files -i --exclude-from=.gitignore`; do git rm --cached $i; done
> git commit -m 'Removed all files that are in the .gitignore'
> git push origin master

Ich empfehle Ihnen, die zu löschenden Dateien zuerst zu überprüfen, indem Sie die folgende Anweisung ausführen:

git ls-files -i --exclude-from=.gitignore

Ich habe eine Standard-Gitignore-Datei für Visual Studio verwendet und festgestellt, dass alle Protokoll- und Bin-Ordner im Projekt entfernt wurden, was nicht meine beabsichtigte Aktion war.

Oncel Umut TURER
quelle
5

Hinweis: Diese Lösung funktioniert nur mit der Github Desktop-Benutzeroberfläche .

Mit der Github Desktop-Benutzeroberfläche ist dies sehr einfach.

  1. Verschieben Sie den Ordner vorübergehend an einen anderen Speicherort (aus dem Projektordner).

  2. Bearbeiten Sie Ihre .gitignoreDatei und entfernen Sie den Ordnereintrag, der das Master-Repository auf der Github-Seite entfernen würde.

  3. Übernehmen und synchronisieren Sie den Projektordner.

  4. Verschieben Sie den Ordner in den Projektordner

  5. .gitignoreDatei erneut bearbeiten .

Das ist alles.

efkan
quelle
5

Die Antwort von Blundell sollte funktionieren, aber aus irgendeinem bizarren Grund hat es bei mir nicht geklappt. Ich musste zuerst die vom ersten Befehl ausgegebenen Dateinamen in eine Datei leiten und dann diese Datei durchlaufen und diese Datei einzeln löschen.

git ls-files -i --exclude-from=.gitignore > to_remove.txt
while read line; do `git rm -r --cached "$line"`; done < to_remove.txt
rm to_remove.txt
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master
Chris Aelbrecht
quelle
4

Diese Methode wendet das Standardverhalten von .gitignore an und erfordert keine manuelle Angabe der Dateien, die ignoriert werden müssen .

Kann nicht --exclude-from=.gitignoremehr verwendet werden: / - Hier ist die aktualisierte Methode:

Allgemeiner Rat: Beginnen Sie mit einem sauberen Repo - alles festgeschrieben, nichts im Arbeitsverzeichnis oder Index anstehend, und erstellen Sie ein Backup !

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#optionally add anything to the index that was previously ignored but now shouldn't be:
git add *

#commit again
#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.

git commit -m "re-applied modified .gitignore"

#other devs who pull after this commit is pushed will see the  newly-.gitignored files DELETED

Wenn Sie auch die neu ignorierten Dateien aus dem Festschreibungsverlauf des Zweigs löschen müssen oder wenn Sie nicht möchten, dass die neu ignorierten Dateien aus zukünftigen Pulls gelöscht werden, lesen Sie diese Antwort .

Goofologie
quelle
0

Wenn Sie mit PowerShell arbeiten, versuchen Sie Folgendes als einzelnen Befehl.

PS MyRepo> git filter-branch --force --index-filter
>> "git rm --cached --ignore-unmatch -r .\\\path\\\to\\\directory"
>> --prune-empty --tag-name-filter cat -- --all

Dann git push --force --all.

Dokumentation: https://git-scm.com/docs/git-filter-branch

Shaun Luttin
quelle
Wie unterscheidet sich die Verwendung git filter-branchvon der Verwendung git rm? Ich dachte ursprünglich, ich muss eine Version von verwenden, git filter-branchaber die meisten Kommentare hier empfehlen die Verwendung git rm. Soweit ich git rmweiß, wird es nur aus dem aktuellen Arbeitsverzeichnis und Index entfernt. Wenn jedoch zuvor mehrere Commits hinzugefügt wurden, befindet es sich weiterhin im Repository.
Alpha_989
Recht. git rmwird die Datei aus dem letzten Commit in der Zukunft entfernen. git filter-branchLassen Sie uns es aus der gesamten Geschichte entfernen. Siehe auch: help.github.com/articles/…
Shaun Luttin