Entfernen Sie eine Datei mit einem seltsamen Namen aus Git

Lesezeit: 4 Minuten

Entfernen Sie eine Datei mit einem seltsamen Namen aus Git
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


Entfernen Sie eine Datei mit einem seltsamen Namen aus Git
VonC

Da Sie sich in bash befinden, könnten Sie die verwenden printf-Befehl:

git rm --cached `printf "test/fixtures/companies.yml342200250companies.yml"`

Oktale Escapezeichen, die mit beginnen, können bis zu vier Ziffern enthalten.
(POSIX spezifiziert bis zu drei)

Eine ähnliche Lösung finden Sie unter “Git: wie man Dateinamen mit oktaler Notation auf der Kommandozeile angibt”.

Dadurch wird die Datei aus dem Index entfernt, während sie weiterhin im Arbeitsbaum bleibt.
Sie können es dann umbenennen, wenn Sie möchten.


Update mit Git 2.18 (Q2 2018, 6 Jahre später), die Verwendung einer einfachen Vervollständigung sollte funktionieren.

Sehen Commit 3dfe23b (16. April 2018) von SZEDER Gábor (szeder).

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!

.

770480cookie-checkEntfernen Sie eine Datei mit einem seltsamen Namen aus Git

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy