Entfernen Sie eine Datei mit einem seltsamen Namen aus Git
Lesezeit: 4 Minuten
szirrus
Ich habe eine Datei, die es geschafft hat, sich selbst zu nennen:
# file's name (both lines)
companies.yml
companies.yml
# entry in my git working tree
"test/fixtures/companies.yml342200250companies.yml"
Aus ärgerlichen Gründen ist der Arbeitsbaum dieses speziellen Projekts voller anderer Dateien, die noch organisiert werden müssen. Ich würde gerne den obigen Eintrag da rausbekommen, aber wenn ich es versuche git add "test/fixtures..." oder git rm "test/fixtures..." es schlägt fehl: fatal: pathspec 'test/fixtures/companies.yml342200250companies.yml' did not match any files
Wie kann ich damit umgehen?
Git-Status
On branch master
# Your branch is ahead of 'production/master' by 4 commits.
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
modified: [other files]
modified: "test/fixtures/companies.yml342200250companies.yml"
Ich kann erschaffen, git add und git rm eine Datei mit diesem Namen mit kaum Schwierigkeiten. Auf welcher Plattform bist du?
– Fred Foo
6. November 12 um 12:07 Uhr
git rm test/fixtures/companies.yml* (wenn Sie keine anderen Dateien haben, die dem Muster entsprechen würden)? Die Verwendung von Platzhaltern zur Umgehung problematischer Dateinamen ist eine alte Tradition.
– Michal Politowski
6. November 12 um 12:14 Uhr
was macht git checkout -- test/fixtures... tun?
– Yuval Adam
6. November 12 um 12:18 Uhr
@larsmans – Ich verwende OS X.
– szirrus
6. November 12 um 12:35 Uhr
@MichałPolitowski – Ich habe das versucht und die Datei ist weg, aber der Arbeitsbaum hat immer noch die Zeile “gelöscht”.
– szirrus
6. November 12 um 12:36 Uhr
Git druckt die wörtlichen Oktette der UTF-8-Codierung des Dateinamens, da es sich um Nicht-ASCII-Zeichen handelt, und druckt sie als oktale Escapezeichen. Ihre Shell versteht sie jedoch nicht und sendet beim Ausschneiden und Einfügen buchstäbliche Backslashes und Ziffern an den Befehl git, sodass Sie tatsächlich einen anderen Dateinamen eingeben.
Verwenden Sie nach der Eingabe entweder die Tab-Vervollständigung test/fixtures/companies.yml (falls Ihre Shell dies unterstützt), die die eigentlichen Zeichen oder einen Platzhalter anstelle der Escapes eingeben test/fixtures/companies.yml*companies.yml. Letzteres Machtwird aber wahrscheinlich nicht mit anderen Dateinamen übereinstimmen.
Eine andere Möglichkeit besteht natürlich darin, die Datei einfach in etwas Vernünftigeres umzubenennen und dann zu verwenden git add -u / git add . um Git dazu zu bringen, die Umbenennung zu bemerken.
Ich hatte keine Tab-Vervollständigung in meiner Shell, also habe ich den Namen direkt aus dem Finder kopiert git rm "text/fixtures/[paste]". Das hat funktioniert! +1
– szirrus
6. November 12 um 12:42 Uhr
@sscirrus eine ziemlich vollständige Erklärung des Problems und eine funktionierende Lösung. +1 auch von mir.
– VonC
6. November 12 um 12:47 Uhr
Ich entfernte eine WordPress-Installation aus meinem lokalen Repo (mit Uploads, die UTF8-Zeichen enthielten) und git rm blog/* wirkte Wunder. Danke!
– h2oooooo
5. Februar 13 um 11:39 Uhr
VonC
Da Sie sich in bash befinden, könnten Sie die verwenden printf-Befehl:
Vervollständigung: Unterstützt die Vervollständigung von Nicht-ASCII-Pfadnamen
Es sei denn, der Benutzer hat ‘core.quotePath=false‘ irgendwo in der Konfiguration, beide ‘git ls-files‘ und ‘git diff-index‘ wird standardmäßig alle Pfadnamen in Anführungszeichen setzen, die Bytes mit Werten größer als enthalten 0x80und maskieren Sie diese Bytes als ‘nnn‘ Oktalwerte.
Dies verhindert das Vervollständigen von Pfaden, wenn die zu vervollständigende aktuelle Pfadkomponente Nicht-ASCII-Zeichen, insbesondere UTF-8, enthält, da keiner der aufgelisteten Pfade in Anführungszeichen mit dem aktuellen Wort in der Befehlszeile übereinstimmt.
Satz ‘core.quotePath=false‘ für diejenigen ‘git ls-files‘ und ‘git diff-index‘-Aufrufe, sodass sie keine Bytes höher berücksichtigen als 0x80 als “ungewöhnlich” und zitiert keine Pfadnamen, die solche Zeichen enthalten.
Beachten Sie, dass Pfadnamen mit Backslash, doppelten Anführungszeichen oder Steuerzeichen weiterhin in Anführungszeichen gesetzt werden; ein späterer Patch in dieser Serie wird sich damit befassen.
Danke @VonC. Schöne Lösung, +1.
– szirrus
6. November 12 um 12:43 Uhr
Ich habe gerade festgestellt, dass diese Lösungen die Datei nur in verschieben changes to be committed. Es lässt meinen Arbeitsbaum nicht allein …
– szirrus
6. November 12 um 13:16 Uhr
@sscirrus Ich habe die Antwort bearbeitet, um sicherzustellen, dass der Arbeitsbaum nicht betroffen ist.
– VonC
6. November 12 um 13:57 Uhr
Ich wollte einen Ordner in meinem Git-Repository entfernen, dessen Name russische Buchstaben enthielt: “Файлы Mail.Ru Агента”. Zuerst habe ich den Ordner manuell gelöscht und wollte ihn in git mit löschen
git rm "..."
Befehl im nächsten Schritt. Aber git zeigte mir einen sehr akryptischen Namen des gelöschten Ordners: “320244320260320271320273321213 Mail.Ru 320220320263320265 320275321202320260”. Ich habe den Ordner mit wiederhergestellt
git checkout
und dann einfach den Namen des Ordners kopiert und den Befehl ausgeführt
git rm "Файлы Mail.Ru Агента/*"
Es funktionierte!
.
7704800cookie-checkEntfernen Sie eine Datei mit einem seltsamen Namen aus Gityes
Ich kann erschaffen,
git add
undgit rm
eine Datei mit diesem Namen mit kaum Schwierigkeiten. Auf welcher Plattform bist du?– Fred Foo
6. November 12 um 12:07 Uhr
git rm test/fixtures/companies.yml* (wenn Sie keine anderen Dateien haben, die dem Muster entsprechen würden)? Die Verwendung von Platzhaltern zur Umgehung problematischer Dateinamen ist eine alte Tradition.
– Michal Politowski
6. November 12 um 12:14 Uhr
was macht
git checkout -- test/fixtures...
tun?– Yuval Adam
6. November 12 um 12:18 Uhr
@larsmans – Ich verwende OS X.
– szirrus
6. November 12 um 12:35 Uhr
@MichałPolitowski – Ich habe das versucht und die Datei ist weg, aber der Arbeitsbaum hat immer noch die Zeile “gelöscht”.
– szirrus
6. November 12 um 12:36 Uhr