Git Repo mit neuer .gitignore-Datei neu synchronisieren

191

Ist es möglich, ein Git-Repository nach dem Aktualisieren der Gitignore-Datei zu "aktualisieren"?

Ich habe meinem Gitignore gerade weitere Ignorationen (?) Hinzugefügt und möchte bereits im Repo vorhandene Elemente entfernen, die mit der neuen Datei übereinstimmen.

Christian Wattengård
quelle
Könnte sein, würde diese Lösung bereits festgeschriebene Dateien löschen, die mit dem neuen Gitignore übereinstimmen?
Christian Wattengård
99
+1 für die Erfindung des Wortes "Ignoranz".
Aasmund Eldhuset
3
en.wiktionary.org/wiki/ignoration @AasmundEldhuset es ist offiziell
Daniel Springer
1
@ user770: Heute habe ich gelernt!
Aasmund Eldhuset

Antworten:

369

Die in " .gitignore-Datei nicht ignorieren " erwähnte Lösung ist etwas extrem, sollte aber funktionieren:

# rm all files
git rm -r --cached .
# add all files as per new .gitignore
git add .
# now, commit for new .gitignore to apply
git commit -m ".gitignore is now working"

( Stellen Sie sicher, dass Sie zuerst Ihre Änderungen festschreiben, die Sie behalten möchten , um Vorfälle zu vermeiden, wie in den Kommentaren von jball037 unten angegeben .
Mit dieser --cachedOption bleiben Ihre Dateien jedoch auf Ihrer Festplatte unberührt.)

Sie haben auch eine andere feinkörnigere Lösung im Blog-Beitrag " Git dazu bringen, bereits verfolgte Dateien zu ignorieren ":

git rm --cached `git ls-files -i --exclude-standard`

Bassim schlägt in seiner Bearbeitung vor :

Dateien mit Leerzeichen in ihren Pfaden

Falls Sie eine Fehlermeldung wie erhalten fatal: path spec '...' did not match any files, befinden sich möglicherweise Dateien mit Leerzeichen im Pfad.

Sie können alle anderen Dateien mit der Option entfernen --ignore-unmatch:

git rm --cached --ignore-unmatch `git ls-files -i --exclude-standard`

Nicht übereinstimmende Dateien verbleiben jedoch in Ihrem Repository und müssen explizit entfernt werden, indem ihr Pfad in doppelte Anführungszeichen gesetzt wird:

git rm --cached "<path.to.remaining.file>"
VonC
quelle
Ich habe festgestellt, dass der Schritt zum Hinzufügen von Git nicht erforderlich ist. Wenn ich den Git-Status nach dem Zwischenspeichern von Git rm ausführe, befinden sich die entfernten Dateien bereits im Staging-Bereich, und Sie können sie einfach festschreiben.
Kap
3
Ich habe das gerade ausgeführt, alle meine nicht festgeschriebenen Änderungen verloren und fast meinen Rücktritt von meinem Job angekündigt. Die akzeptierte Antwort auf diesen Thread hat mir das Leben gerettet: stackoverflow.com/questions/2125710/how-to-revert-a-git-rm-r
jball037
2
@VonC Entschuldigung, das war nicht als Scherz oder Stock gedacht :) Aber ja, ich habe --cached verwendet und alle meine nicht festgeschriebenen Änderungen gingen verloren, als ich meine Dateien überprüfte. Für einen Moment in Panik geraten, aber "git reset HEAD" stellte meine Dateien wieder her (diesmal jedoch ohne die in .gitignore angegebenen Dateien, sodass Ihre Lösung immer noch funktionierte!)
jball037
3
@ jball037 Gut. Ich habe die Warnung hinzugefügt und die Antwort entsprechend bearbeitet.
VonC
1
Wenn ich nur eine Zeile weiter lese, bevor ich dies tue "(stellen Sie sicher, dass Sie zuerst Ihre Änderungen festschreiben, die Sie behalten möchten, um jeden Vorfall als jball037 zu vermeiden" #fml
Aiden Strydom
9

Ich könnte es falsch verstehen, aber versuchen Sie, neu ignorierte Dateien zu löschen, oder möchten Sie neue Änderungen an diesen Dateien ignorieren? In diesem Fall funktioniert das Ding.

Wenn Sie zuvor festgeschriebene ignorierte Dateien löschen möchten, verwenden Sie

git rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'
Gracchus
quelle
Was ist mit den einfachen Anführungszeichen hier?
IgorGanapolsky
Dies ist eine großartige Antwort
Holene
Dies ist ein sehr einfacher Grund, um Dateien zu entfernen, nachdem ich meinen .gitignore aktualisiert habe. Es sind jedoch einige kleinere Aktualisierungen erforderlich: `` git rm –cached git ls-files -i –exclude-standard git commit -m 'bereinigen ``
Aaron
1

Ich weiß, dass dies eine alte Frage ist, aber die Lösung von gracchus funktioniert nicht, wenn Dateinamen Leerzeichen enthalten. VonCs Lösung für Dateinamen mit Leerzeichen besteht darin, sie nicht mithilfe von zu entfernen --ignore-unmatchund dann manuell zu entfernen. Dies funktioniert jedoch nicht, wenn viele vorhanden sind.

Hier ist eine Lösung, die Bash-Arrays verwendet, um alle Dateien zu erfassen.

# Build bash array of the file names
while read -r file; do 
    rmlist+=( "$file" )
done < <(git ls-files -i --exclude-standard)

git rm –-cached "${rmlist[@]}"

git commit -m 'ignore update'
Jason
quelle