Ändern der Groß- und Kleinschreibung von Dateinamen in Git

473

Ich versuche, eine Datei umzubenennen, um eine andere Groß- und Kleinschreibung als zuvor zu erhalten:

git mv src/collision/b2AABB.js src/collision/B2AABB.js
fatal: destination exists, source=src/collision/b2AABB.js, destination=src/collision/B2AABB.js

Wie Sie sehen können, wirft Git einen Anfall darüber. Ich habe versucht, nur mit dem einfachen alten mvBefehl umzubenennen, aber Git übernimmt die Umbenennung nicht (als Umbenennung oder als neue nicht verfolgte Datei).

Wie kann ich eine Datei so ändern, dass sie eine andere Groß- und Kleinschreibung mit demselben Namen hat? Ich bin auf Mac OS X 10.7.3 (Lion) mit Git 1.7.9.1 unter Verwendung der Z-Shell (zsh) 4.3.15.

knpwrs
quelle
49
Dies liegt daran, dass das osx-Dateisystem standardmäßig die Groß- und Kleinschreibung beibehält und die Groß- und Kleinschreibung nicht berücksichtigt. Sie können einfach in zwei Schritten fortfahren:git mv myfile foo; git mv foo MyFile
Tonio
16
Habe es mit "git mv --force myfile MyFile" zum Laufen gebracht.
Marcello de Sales
7
Ab Git 2.0.1 (Juni 2014) git mv hello.txt Hello.txtfunktioniert das Betriebssystem ohne Berücksichtigung der Groß- und Kleinschreibung. Siehe meine Antwort unten
VonC
1
Linking stackoverflow.com/questions/1793735/…
Oleg Estekhin

Antworten:

554

Ab Git 2.0.1 (25. Juni 2014) git mvfunktioniert a nur auf einem Betriebssystem, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird .

Siehe commit baa37bf von David Turner ( dturner-tw) .

mv: Ermöglichen Sie das Umbenennen, um Groß- und Kleinschreibung zu korrigieren

" git mv hello.txt Hello.txt" Bei einem Dateisystem, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird, wird immer ein destination already existsFehler ausgelöst, da diese beiden Namen aus Sicht des Dateisystems auf denselben Pfad verweisen und der Benutzer " --force" angeben muss, wenn der Fall des im Index und im Index aufgezeichneten Pfads korrigiert wird nächstes Commit.

Erkennen Sie diesen Fall und lassen Sie ihn zu, ohne " --force" zu benötigen .

git mv hello.txt Hello.txtfunktioniert einfach (nicht --forcemehr erforderlich).


Die andere Alternative ist:

git config --global core.ignorecase false

Und benennen Sie die Datei direkt um; git hinzufügen und festschreiben.

VonC
quelle
2
FWIW dies ging zurück oder funktionierte nie unter Windows. Bin am 2.15.1.windows.2 und muss noch --force
TTimo
1
@Adowrath Tolle Neuigkeiten!
VonC
Funktioniert dies auch für die Großschreibung von Erweiterungen? Zum Beispiel, wenn der Dateiname image.TXT und ich ihn wie image.txt umbenennen möchten
siluveru kiran kumar
@siluverukirankumar Ja. Hattest du ein Problem mit diesem Anwendungsfall?
VonC
1
Habe dies unter Windows ausgeführt, indem ich diesen Befehl ausgeführt habe undgit config core.ignorecase false
John Targaryen
452

In Anbetracht der Antwort von Larsks können Sie es mit einem einzigen Befehl mit "--force" zum Laufen bringen:

 git mv --force myfile MyFile
Marcello de Sales
quelle
3
Wenn Sie sich in einem Dateisystem befinden, bei dem die Groß- und Kleinschreibung nicht berücksichtigt
Levi
1
Dies ist zwar die richtige Antwort für den ersten Schritt, aber wie Sie dann unter Mac OS X zu einem anderen Zweig wechseln, wenn der andere Zweig die alte Großschreibung hat. Ich erhalte **** Fehler: Die folgenden nicht verfolgten Arbeitsbaumdateien würden beim Auschecken überschrieben: ****
TJChambers
1
Dies schlug beim Error: Will not add file alias 'MyFile' ('myfile' already exists in index)
Festschreiben
98

Manchmal möchten Sie die Groß- und Kleinschreibung vieler Dateinamen in einem Dateisystem ändern, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird (z. B. unter OS X oder Windows). Doing git mvBefehle werden schnell ermüden. Um die Sache ein bisschen einfacher zu machen, mache ich Folgendes:

  1. Verschieben Sie alle Dateien außerhalb des Verzeichnisses auf den Desktop.
  2. Führen Sie a aus git add . -A, um alle Dateien zu entfernen.
  3. Benennen Sie alle Dateien auf dem Desktop in die richtige Groß- und Kleinschreibung um.
  4. Verschieben Sie alle Dateien zurück in das ursprüngliche Verzeichnis.
  5. Mach a git add .. Git sollte sehen, dass die Dateien umbenannt werden.

Jetzt können Sie ein Commit durchführen, das besagt, dass Sie die Großschreibung des Dateinamens geändert haben.

MrHus
quelle
3
Dies geht zu Lasten des gesamten Verlaufs der Dateien, die Sie ein- und ausziehen, oder? Ich vermute, der Git mv --force hat dieses Manko nicht.
LOAS
12
Nein, dies würde nicht den gesamten Verlauf entfernen. Beachten Sie, dass zwischen den beiden Adds kein Commit besteht.
Michael L Perry
63

Bei Dateinamen unter OS X wird nicht zwischen Groß- und Kleinschreibung unterschieden (standardmäßig). Dies ist eher ein Betriebssystemproblem als ein Git-Problem. Wenn Sie die Datei entfernen und lesen, sollten Sie das erhalten, was Sie möchten, oder es in etwas anderes umbenennen und dann wieder umbenennen.

Larsks
quelle
2
Sie können git clonedas Repo auch auf einem Linux-System ausführen, die Dateien umbenennen und sie nur für diese Situation festschreiben (wenn Sie ein Linux-System zur Hand haben).
Gitaarik
4
Bei Dateisystemen unter OS X kann zwischen Groß- und Kleinschreibung unterschieden werden. Sie können sie bei der Installation konfigurieren. So überprüfen Sie, ob bei einer OS X-Partition zwischen Groß- und Kleinschreibung unterschieden wird
Flimm
2
... daher das "(standardmäßig)" in der Antwort.
Larsks
4
Zur Bestätigung können Sie git rm --cached fileorfolderdie Datei oder den Ordner aus git entfernen, ohne die Datei oder den Ordner aus dem Dateisystem zu entfernen. Dann können Sie einfach die Datei oder den Ordner mit erneut hinzufügen git add fileorfolder.
Kas
32

Setzen Sie ignorecaseauf falsein git Config

Im ursprünglichen Beitrag geht es um "Ändern der Großschreibung von Dateinamen in Git":

Wenn Sie versuchen, die Großschreibung eines Dateinamens in Ihrem Projekt zu ändern, müssen Sie das Umbenennen von Git nicht erzwingen . IMO, ich würde lieber die Großschreibung von meiner IDE / meinem Editor ändern und sicherstellen, dass ich Git richtig konfiguriere, um die Umbenennung zu übernehmen.

Standardmäßig ist eine Git-Vorlage so eingestellt, dass Groß- und Kleinschreibung ignoriert wird (Git-Groß- und Kleinschreibung wird nicht berücksichtigt). Um zu überprüfen, ob Sie über die Standardvorlage verfügen, rufen Sie --getden Wert für einen angegebenen Schlüssel ab. Verwenden Sie --localund --global, um Git anzuzeigen, ob ein Konfigurationsschlüsselwert aus Ihrer lokalen oder globalen Git-Repository-Konfiguration abgerufen werden soll. Wenn Sie beispielsweise Ihren globalen Schlüssel nachschlagen möchten core.ignorecase:

git config --global --get core.ignorecase

Wenn dies zurückkehrt true, stellen Sie sicher, dass Folgendes festgelegt ist:

git config --global core.ignorecase false

(Stellen Sie sicher, dass Sie über die erforderlichen Berechtigungen zum globalen Ändern verfügen.) Und dort haben Sie es; Jetzt würde Ihre Git-Installation Groß- und Kleinschreibung nicht ignorieren und sie als Änderungen behandeln.

Wenn Sie an mehrsprachigen Projekten arbeiten und der Meinung sind, dass nicht alle Projekte von Git zwischen Groß- und Kleinschreibung unterschieden werden sollten, aktualisieren Sie einfach die lokale core.ignorecaseDatei.

Segmentiert
quelle
6
Und wenn git config --global --get core.ignorecasenichts zurückkommt. Ist es true? denn nachdem ich es eingestellt habe, falsewird false zurückgegeben (Windows 10)
fralbo
Und es scheint nicht wie erwartet zu funktionieren. Ich meine, der Desktop-Client sieht die Änderung, aber nach dem Festschreiben / Synchronisieren bleibt der Dateiname online unverändert!
Fralbo
Arbeitete für mich (und besser für mehrere Dateien als mit git mv). Ich gehe auch davon aus, dass es standardmäßig als wahr angesehen wird (dh es wird der Fall ignoriert). Entweder das, oder es entspricht der Richtlinie des Betriebssystems für das Dateinamengehäuse.
Jerry
DAS ist DIE Antwort. Ich habe es gerade benutzt.
Dave Everitt
1
Dies sollte die ausgewählte Antwort sein
Dave Everitt
7

Sie können das Verzeichnis ".git" öffnen und dann die Datei "config" bearbeiten. Setzen Sie unter "[core]" set "ignorecase = true" und Sie sind fertig;)

Деян Добромиров
quelle
scheint, dass es in false geändert werden sollte, so dass bei git zwischen Groß- und Kleinschreibung unterschieden wird?
Jonathan vor
1

So löschen Sie git mvDateien unter macOS in Kleinbuchstaben:

for f in *; do git mv "$f" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done

Alle Dateien in einem Ordner werden in Kleinbuchstaben geschrieben.

Softarn
quelle
1

Dieses Python-Snippet enthält git mv --forcealle Dateien in einem Verzeichnis in Kleinbuchstaben. Zum Beispiel foo / Bar.js wird sich foo / bar.js über git mv foo/Bar.js foo/bar.js --force.

Ändern Sie es nach Ihren Wünschen. Ich dachte nur, ich würde teilen :)

import os
import re

searchDir = 'c:/someRepo'
exclude = ['.git', 'node_modules','bin']
os.chdir(searchDir)

for root, dirs, files in os.walk(searchDir):
    dirs[:] = [d for d in dirs if d not in exclude]
    for f in files:
        if re.match(r'[A-Z]', f):
            fullPath = os.path.join(root, f)
            fullPathLower = os.path.join(root, f[0].lower() + f[1:])
            command = 'git mv --force ' + fullPath + ' ' + fullPathLower
            print(command)
            os.system(command)
mischte
quelle
-1

Arbeitsbeispiel:

git mv ./src/images/poster_video.PNG ./src/images/poster_video.png
Daniel Batista
quelle
2
Ihre Antwort löst die ursprüngliche Frage nicht. Sie sind niedrig die Erweiterung
Tavo
Ich suche genau das, aber für 500 Bilder. Ich möchte ./src/images/TESTIMAGE.png in ./src/images/testimage.png auf Git umbenennen
Mohak Londhe