Gelöschte Dateien bereitstellen

499

Angenommen, ich habe eine Datei in meinem Git-Repository mit dem Namen foo.

Angenommen, es wurde mit rm(nicht git rm) gelöscht . Dann zeigt der Git-Status:

Changes not staged for commit:

    deleted: foo

Wie inszeniere ich das Löschen einzelner Dateien?

Wenn ich es versuche:

git add foo

Es sagt:

'foo' did not match any files.
Andrew Tomazos
quelle
2
War dies ein Problem in alten Git-Versionen? Heutzutage scheint es keine zu sein, es funktioniert ähnlich wie geänderte Dateien.
cst1992

Antworten:

22

Seit Git 2.0.0 git addwerden auch Dateilöschungen durchgeführt.

Git 2.0.0 Docs - Git-Add

<pathspec>…

Dateien, aus denen Inhalte hinzugefügt werden sollen. Fileglobs (zB * .c) können angegeben werden, um alle> passenden Dateien hinzuzufügen. Es kann auch ein führender Verzeichnisname (z. B. Verzeichnis zum Hinzufügen von Verzeichnis / Datei1 und Verzeichnis / Datei2) angegeben werden, um den Index so zu aktualisieren, dass er dem aktuellen Status des gesamten Verzeichnisses entspricht (z. B. wird durch Angabe von Verzeichnis nicht nur ein geändertes Dateiverzeichnis / Datei1 aufgezeichnet Im Arbeitsbaum wurde dem Arbeitsbaum ein Dateiverzeichnis / file2 hinzugefügt, aber auch ein Dateiverzeichnis / file3, das aus dem Arbeitsbaum entfernt wurde. Beachten Sie, dass ältere Git-Versionen zum Ignorieren entfernter Dateien verwendet wurden. Verwenden Sie die Option --no-all, wenn Sie dies tun Sie möchten geänderte oder neue Dateien hinzufügen, entfernte jedoch ignorieren.

peflorencio
quelle
Die akzeptierte Antwort löst das Problem nicht - und die anderen sind seit Git 2.0.0 umständlicher - dies ist der beste Weg! Sie haben meine Gegenstimme
João Antunes
519

Verwenden Sie git rm foodiese Option, um die Datei zum Löschen bereitzustellen. (Dadurch wird die Datei auch aus dem Dateisystem gelöscht, wenn sie zuvor nicht gelöscht wurde. Sie kann natürlich aus git wiederhergestellt werden, da sie zuvor eingecheckt wurde.)

Verwenden Sie, um die Datei zum Löschen bereitzustellen, ohne sie aus dem Dateisystem zu löschen git rm --cached foo

Wooble
quelle
8
Sie können auch ein --cacheFlag hinzufügen , um Dateien nur aus dem Repository zu entfernen und sie im Dateisystem unberührt zu lassen.
Hauleth
Was wäre der Prozess, um diesen Vorgang rückgängig zu machen, dh die Datei zum Löschen zu entfernen? Ist das möglich?
Longda
82
Tatsächlich hat OP gefragt, wie die bereits gelöschte Datei bereitgestellt werden soll, und dies kann von durchgeführt werden git status | grep 'deleted:' | cut -d':' -f2 | xargs -t -I {} git add -u "{}". Andere Antworten scheinen zu zeigen, wie das Entfernen von Dateien korrekt durchgeführt wird (nicht jedoch, wie bereits gelöschte Dateien bereitgestellt werden). ps. Der xargsbasierte Befehl funktioniert für mich unter Ubuntu 12.04, aber wenn ich ihn manuell mache git add -u deleted_file.txt, funktioniert er nicht. Mein Git ist 1.7.9.5
Dimitry K
8
@DimitryK: Stellt git rmeine Datei zum Löschen bereit, auch wenn sie bereits aus dem Dateisystem gelöscht wurde. Und wie der Kommentar von OP zu einer anderen Antwort zeigt, wollten sie eine bestimmte Datei bereitstellen, die bereits gelöscht wurde.
Wooble
3
git rmstellt bereits entfernte Dateien nicht bereit. Dieser Fehler wird ausgelöst : fatal: pathspec '~.SLDASM' did not match any files. Hier sind Bildschirme mit Beweis: i.imgur.com/cKNKGGe.png i.imgur.com/1p9JdWF.png . Der erste Screenshot zeigt deutlich, dass 2 Dateien gelöscht und nicht bereitgestellt wurden. Der zweite Screenshot zeigt, dass git rm "~$Box.SLDASM"dieser Fehler beim Eingeben ausgelöst wird.
KulaGGin
413

Auch wenn es richtig git rm [FILE]ist, können Sie es alternativ tun git add -u.

Laut git-addDokumentation:

-u --update

Aktualisieren Sie den Index genau dort, wo bereits ein Eintrag mit [DATEI] übereinstimmt. Dadurch werden Indexeinträge entfernt und an den Arbeitsbaum angepasst, es werden jedoch keine neuen Dateien hinzugefügt.

Wenn bei Verwendung der Option -u keine [DATEI] angegeben wird, werden alle nachverfolgten Dateien im gesamten Arbeitsbaum aktualisiert (alte Versionen von Git wurden verwendet, um die Aktualisierung auf das aktuelle Verzeichnis und seine Unterverzeichnisse zu beschränken).

Daraufhin wird der Index aktualisiert und die Dateien werden ordnungsgemäß bereitgestellt.

Sailesh
quelle
56
Ja git add -A ., alle Änderungen werden hinzugefügt. Ich wollte speziell eine gelöschte Datei bereitstellen.
Andrew Tomazos
25
Dadurch werden alle geänderten Dateien hinzugefügt. Nicht nur gelöschte Dateien.
foreever
3
Das ist richtig. Insbesondere werden alle Änderungen in Dateien erfasst, die bereits verfolgt wurden, unabhängig davon, ob sie gelöscht oder nur geändert wurden. Dies ist hilfreich, wenn Sie mehrere Dateien löschen und diese nicht einzeln bereitstellen möchten.
Sailesh
9
Gibt es eine Möglichkeit, nur gelöschte und nicht geänderte Dateien bereitzustellen? Nur neugierig.
aug
11
Ich habe getan git add -u FolderWithDeletedFiles/und es hat getan, was ich will, danke
Parlament
158

So stellen Sie alle manuell gelöschten Dateien bereit:

git rm $(git ls-files --deleted)

git rm-deletedFühren Sie Folgendes aus, um diesem Befehl einen Alias ​​hinzuzufügen :

git config --global alias.rm-deleted '!git rm $(git ls-files --deleted)'
Ian Mackinnon
quelle
2
Die $ () Notation existiert offenbar nicht in der Windows Bash Console, was zuunknown option `deleted)
Félix Gagnon-Grenier
2
Ich denke nicht, dass dies funktioniert, wenn Sie Leerzeichen auf Ihrem Weg haben. Zumindest nicht auf meinem System (mit zsh).
Wil Shipley
3
Hat perfekt für mich funktioniert! Genau das getan, was ich brauchte. RIESIGE Wertschätzung hier!
RedSands
In Windows Dofor /F %I in ('git ls-files --deleted') do git add -u %I
Eis
3
Dies funktioniert nicht für Dateinamen mit Leerzeichen, 'git add -u' bei Bedarf.
J-Dizzle
33

um alle fertig gelöschten Dateien hinzuzufügen

git status -s | grep -E '^ D' | cut -d ' ' -f3 | xargs git add --all

danke überprüfen, um sicherzugehen

git status

du solltest gut sein zu gehen

chet corey
quelle
5
Bestätigen, dass dies funktioniert. Ich denke, die Lektion hier ist jedoch nicht zu tun rm <file>, sonderngit rm <file>
DanGordon
1
Zu
Ihrer Information
1
Dies funktioniert nicht für Dateinamen mit Leerzeichen, 'git add -u' bei Bedarf.
J-Dizzle
Funktioniert perfekt für mich weiter git version 2.15.2 (Apple Git-101.1).
Kalob Taulien
funktioniert perfekt auf Linux-Konsole!
Ahmed AMMOURI
8

Sie können verwenden

git rm -r --cached -- "path/to/directory"

um ein gelöschtes Verzeichnis zu inszenieren.

GameScripting
quelle
8

Sie können diesen Befehl verwenden

git add  `git ls-files --deleted`
gnana jeyam95
quelle
0

für diejenigen, die git 2.x + in Powershell verwenden:

foreach ($filePath in (git ls-files --deleted)) { git add "$filePath" }
Orion Elenzil
quelle