Wie kann ich nur Dateinamenänderungen in Git zwischen Groß- und Kleinschreibung unterscheiden?

1302

Ich habe ein paar Dateien Namen von de-Kapital der ersten Buchstaben geändert, wie in Name.jpgzu name.jpg. Git erkennt diese Änderungen nicht und ich musste die Dateien löschen und erneut hochladen. Gibt es eine Möglichkeit, dass Git bei der Überprüfung auf Änderungen der Dateinamen zwischen Groß- und Kleinschreibung unterscheiden kann? Ich habe keine Änderungen an der Datei selbst vorgenommen.

Gil Shulman
quelle
4
@nwenn dies nicht ganz richtig ist, hat Git tatsächlich eine Konfigurationseinstellung, die steuert, ob die Groß- und Kleinschreibung ignoriert wird oder nicht.
6
Siehe stackoverflow.com/a/24979063/6309 : Seit Git 2.0.1 git mvfunktioniert ein einfaches .
VonC
Mögliches Duplikat von Git: Änderung der
Groß- und Kleinschreibung
Verweisen Sie diesen Beitrag. Ich konnte festschreiben, aber nur git commit -m "msg" ohne Dateipfade als Parameter verwenden. Es hat den Index aktualisiert und die Datei eingecheckt. [Link] stackoverflow.com/questions/35790113/…
ARKS

Antworten:

1516

Sie können git mv verwenden :

git mv -f OldFileNameCase newfilenamecase
Keith Smiley
quelle
12
Dies gibt mir "Quellverzeichnis ist leer", während es nicht ist
WiseStrawberry
6
Die Verwendung von MacOS hier (FS ohne Berücksichtigung der Groß- und Kleinschreibung) und -f hat funktioniert! Danke für den Tipp
Caesarsol
49
In neueren Versionen benötigen Sie das -fFlag nicht mehr .
Joshua Pinter
8
Vergessen Sie nicht, den vollständigen Dateipfad anzugeben. Offensichtlich, ich weiß, aber hat mich für eine Weile
Rickrizzo
7
Nach oben Kommentar gestimmt: Sie tun müssen die -fSchalter mit der neuesten git (2,18) , sonst könnte man die bekommen fatal: destination existsFehler.
DeepSpace101
1037

Git verfügt über eine Konfigurationseinstellung, die angibt, ob zwischen Groß- und Kleinschreibung unterschieden werden soll : core.ignorecase. Um Git mitzuteilen, dass die Groß- und Kleinschreibung beachtet werden soll, setzen Sie diese Einstellung einfach auf false:

git config core.ignorecase false

Dokumentation

Aus der git configDokumentation :

core.ignorecase

Wenn true, können mit dieser Option verschiedene Problemumgehungen aktiviert werden, damit git auf Dateisystemen, bei denen nicht zwischen Groß- und Kleinschreibung unterschieden wird, wie z. B. FAT, besser funktioniert. Wenn eine Verzeichnisliste beispielsweise feststellt, makefilewann git dies erwartet Makefile, geht git davon aus, dass es sich tatsächlich um dieselbe Datei handelt, und merkt sich diese weiterhin als Makefile.

Der Standardwert ist false, außer dass git-clone (1) oder git-init (1) beim Erstellen core.ignorecasedes Repositorys prüfen und gegebenenfalls true setzen .

Dateisysteme, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird

Die beiden beliebtesten Betriebssysteme mit Dateisystemen, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird, sind:

  • Windows
  • OS X.

quelle
9
Nebenbei bemerkt denke ich nicht, dass Mac OS X selbst die Groß- und Kleinschreibung nicht berücksichtigt. Stattdessen bestimmt das Dateisystem die Groß- und Kleinschreibung. Beim Formatieren einer HFS + -Partition können Benutzer wählen, ob zwischen Groß- und Kleinschreibung unterschieden werden soll. Groß- und Kleinschreibung wird nicht berücksichtigt.
spaaarky21
225
In dieser Antwort scheint es sehr erwähnenswert zu sein, dass falsees eine schlechte Idee ist , diese Option in einem Dateisystem ohne Berücksichtigung der Groß- und Kleinschreibung festzulegen . Dies ist nicht unbedingt offensichtlich. Zum Beispiel habe ich dies einfach auf meinem Mac versucht, weil ich dachte, es würde meine Probleme beheben, und dann eine Datei von productPageCtrl.jsin umbenannt ProductPageCtrl.js. Ich habe git statuseine neue Datei namens aufgerufen ProductPageCtrl.js, aber nicht gedacht, dass productPageCtrl.jssie gelöscht wurde. Als ich die neuen Dateien hinzufügte, festschrieb und an GitHub weiterleitete, enthielt das GitHub-Repo jetzt beide Dateien, obwohl mein (angeblich aktuelles) lokales Repo nur eine hatte.
Mark Amery
5
@ MarkAmery Das klingt sehr nach einem Fehler in Ihrem Git-Client. Haben Sie einen Bericht eingereicht?
Domi
24
@Domi das ist kein Bug, das ist erwartetes Verhalten. Es ist in der Tat eine schlechte Idee, dies in einem unempfindlichen Dateisystem auf false zu setzen, da dies der Fall ist. Der Grund, warum git nicht sah, dass die Kleinbuchstaben gelöscht wurden, ist, dass das Dateisystem sie nicht als gelöscht meldet, da es den Fall ignoriert , während git diese Option nicht auf false setzt. Es ist nicht so, dass die Dateinamen bei ntfs oder Fett keine Klein- oder Großbuchstaben haben. Es ist nur so, dass die Suche nach Dateinamen die Groß- und Kleinschreibung ignoriert.
Ohcibi
15
@Domi Git ist klug genug. Aus diesem Grund sollten Sie dies in einem Dateisystem ohne Berücksichtigung der Groß- und Kleinschreibung nicht auf false setzen. Verwenden Sie git mvdiese Option , um die Datei zu verschieben und zu sehen, wie Git sie verwaltet. Wenn Sie die Datei ohne Git verschieben, kann Git nichts tun, da das Dateisystem Git nicht die Wahrheit sagt. Dies ist ein Problem von ntfs / fat / hfs und thelike und nicht von git / linux.
Ohcibi
158

Mit SourceTree konnte ich dies alles über die Benutzeroberfläche tun

  1. Umbenennen FILE.ext inwhatever.ext
  2. Stellen Sie diese Datei bereit
  3. Jetzt umbenennen whatever.ext infile.ext
  4. Stellen Sie diese Datei erneut bereit

Es ist ein bisschen langweilig, aber wenn Sie es nur mit ein paar Dateien machen müssen, ist es ziemlich schnell

CBarr
quelle
5
Das gleiche mit Git Bash
Alex78191
3
"Stage that file" ist der wichtige Teil - keine der anderen Antworten oben hat für mich funktioniert. Es funktionierte tatsächlich mit der einfachen alten Windows-Eingabeaufforderung.
Vlad Sabev
1
Ich wusste nicht, dass dies im Staging-Bereich funktioniert. In meinem Fall wollte ich jedoch die Ordnernamen sowie einige Dateien in diesen Ordnern ändern. Also habe ich zuerst alle Ordner in temporäre Namen umbenannt. Festgeschrieben die neuen Namen (alle Dateien innerhalb) und die "gelöschten" Dateien. Git hat sie alle als "umbenannt" gekennzeichnet. Benennen Sie dann alle diese Ordner wieder in ihre neuen Fallversionen um und legen Sie sie erneut fest. Schließlich wurden diese 2 Commits zusammengeführt. Aber basierend auf dem, was Sie geschrieben haben, hätte ich das Ganze direkt durch den Sating-Bereich erledigen können, ohne 2 Commits + Merge zu erstellen.
ThermoX
3
Funktioniert auch mit gitkraken für Ordnernamen.
Philippe Matray
Ich habe ein Python 3-Skript geschrieben, um diese mühsame Arbeit zu erledigen: stackoverflow.com/a/58159822/4934640
Benutzer
126

Folgendes habe ich unter OS X getan:

git mv File file.tmp
git mv file.tmp file

Zwei Schritte, da ich sonst den Fehler "Datei existiert" erhalten habe. Vielleicht kann es in einem Schritt durch Hinzufügen --cachedoder so gemacht werden.

Sijmen Mulder
quelle
21
wie die Top-Antwort verrät, -f(Kraft) ist die Flagge der Sie suchen
rperryng
5
@rperryng - Nein, das -fFlag hilft nicht, wenn der zugrunde liegende FS nicht zwischen Groß- und Kleinschreibung unterscheidet. Für mich
funktionierte jedoch eine
Mit einem FS ohne Berücksichtigung der Groß- und Kleinschreibung (auf Mac) und -ffunktioniert! Danke für den Tipp
Caesarsol
Dies funktionierte auch mit einem Ordner unter Windows ohne -fFlag.
Nich
git -c "core.ignorecase=false" add .berücksichtigt Dateien, deren Groß- / Kleinschreibung für das Festschreiben geändert wurde.
Nietonfir
67

Manchmal ist es nützlich, die Groß- und Kleinschreibung von Git vorübergehend zu ändern:

Methode 1 - Ändern Sie die Groß- und Kleinschreibung für einen einzelnen Befehl:

git -c core.ignorecase=true checkout mybranchum die Groß- und Kleinschreibung für einen einzelnen checkoutBefehl auszuschalten . Oder allgemeiner : . (Dank an VonC, der dies in den Kommentaren vorgeschlagen hat.)git -c core.ignorecase= <<true or false>> <<command>>

Methode 2 - Ändern Sie die Groß- und Kleinschreibung für mehrere Befehle:

So ändern Sie die Einstellung länger (z. B. wenn mehrere Befehle ausgeführt werden müssen, bevor Sie sie wieder ändern):

  1. git config core.ignorecase(Dies gibt die aktuelle Einstellung zurück, z false. B. ).
  2. git config core.ignorecase <<true or false>> - Stellen Sie die gewünschte neue Einstellung ein.
  3. ... Führen Sie mehrere andere Befehle aus ...
  4. git config core.ignorecase <<false or true>> - Setzen Sie den Konfigurationswert auf die vorherige Einstellung zurück.
Steve Chambers
quelle
1
Warum nicht direkt git -c core.ignorecase=<true or false> checkout <<branch>>? Nichts mehr zurückzusetzen.
VonC
2
Ich hatte eine seltsame Erfahrung mit dem vorgeschlagenen core.ignorecase, wenn ich von Klein- zu Großbuchstaben wechselte, aber nicht von Groß- zu Kleinbuchstaben. Die einzig zuverlässige Lösung scheint darin zu bestehen, die Verwendung eines Betriebssystems zu beenden, das den Dateinamen nicht erkennt.
aspiringGuru
Gibt es einen Grund, warum es eine vorübergehende Änderung sein sollte? Würde dies zu Problemen führen, wenn ich die Einstellungen nur auf Groß- und Kleinschreibung ändern lasse?
Cytsunny
Dies kann von einigen Faktoren abhängen, insbesondere davon, ob das Zieldateisystem zwischen Groß- und Kleinschreibung unterscheidet - siehe en.wikipedia.org/wiki/Case_sensitivity#In_filesystems . Die vorübergehende Änderung kann erforderlich sein, wenn das Bereitstellungsdateisystem eine andere Groß- und Kleinschreibung als das für die Entwicklung verwendete Dateisystem aufweist. Auch in meinem Fall arbeite ich in einem Team, in dem von jedem erwartet wird, dass er die gleichen Git-Einstellungen hat (dh zwischen Groß- und Kleinschreibung unterscheiden). Wenn ich es ausschalte, muss es vorübergehend sein.
Steve Chambers
44

Unter OSX, um dieses Problem zu vermeiden und andere Probleme zu vermeiden , mit auf Groß- und Kleinschreibung Dateisystem entwickeln, können Sie Festplatten - Dienstprogramm verwenden , um einen Fall zu erstellen sensible virtuelles Laufwerk / Disk - Image.

Führen Sie das Festplatten-Dienstprogramm aus, erstellen Sie ein neues Festplatten-Image und verwenden Sie die folgenden Einstellungen (oder ändern Sie sie nach Ihren Wünschen, ohne die Groß- und Kleinschreibung zu beachten):

Screenshot des Mac Disk Utility

Stellen Sie sicher, dass git jetzt auf einem FS mit Groß- und Kleinschreibung beachtet wird:

git config core.ignorecase false
user1821510
quelle
15
Nein, Nuclear führt unter OSX ein Boot-Laufwerk aus, bei dem die Groß- und Kleinschreibung beachtet wird. Sie müssen ohne schlecht geschriebene (ahem, Adobe) Apps leben oder diese in ihrer eigenen, dummen VM ausführen, aber es lohnt sich, wenn Sie hauptsächlich für * nix-Systeme codieren.
Mike Marcacci
1
Dies ist die einzige Option, die ordnungsgemäß funktioniert. Ich habe den Rest ausprobiert und du landest auf die eine oder andere Weise in einer Essiggurke. Lösen Sie das Problem auf diese Weise richtig.
John Hunt
2
Beachten Sie, dass das Festplatten-Dienstprogramm einen Fehler in OS X 10.11 aufweist. Es werden keine Bilder erstellt, bei denen zwischen Groß- und Kleinschreibung unterschieden wird. Sie müssen das Befehlszeilentool hdiutil verwenden. apple.stackexchange.com/questions/217915/…
dellsala
7
Mit APFS in High Sierra ist dies noch einfacher. Klicken Sie auf das Symbol eines Laufwerks mit einem Pluszeichen und fügen Sie ein Volume ohne Groß- und Kleinschreibung hinzu. Es teilt nur den Speicherplatz mit dem Hauptvolume und wird unter / Volumes / volume-name bereitgestellt.
Michael Fox
21

Ich habe die folgenden Lösungen aus den anderen Antworten ausprobiert und sie haben nicht funktioniert:

Wenn Ihr Repository remote gehostet wird (GitHub, GitLab, BitBucket), können Sie die Ursprungsdatei (GitHub.com) umbenennen und das Umbenennen der Datei von oben nach unten erzwingen.

Die folgenden Anweisungen beziehen sich auf GitHub. Die allgemeine Idee dahinter sollte jedoch für jede Remote-Repository-Hosting-Plattform gelten. Beachten Sie den Dateityp, den Sie umbenennen möchten, dh ob es sich um einen Dateityp handelt, den GitHub im Browser als bearbeitbar (Code, Text usw.) oder nicht bearbeitbar (Bild, Binärdatei usw.) erachtet.

  1. Besuchen Sie GitHub.com
  2. Navigieren Sie zu Ihrem Repository auf GitHub.com und wählen Sie den Zweig aus, in dem Sie arbeiten
  3. Navigieren Sie mit dem Dateinavigationswerkzeug der Site zu der Datei, die Sie umbenennen möchten
  4. Können Sie mit GitHub die Datei im Browser bearbeiten?
    • a.) Bearbeitbar
      1. Klicken Sie auf das Symbol "Diese Datei bearbeiten" (es sieht aus wie ein Bleistift).
      2. Ändern Sie den Dateinamen in der Dateinamen-Texteingabe
    • b.) Nicht bearbeitbar
      1. Öffnen Sie die Schaltfläche "Herunterladen" in einem neuen Tab und speichern Sie die Datei auf Ihrem Computer
      2. Benennen Sie die heruntergeladene Datei um
      3. Klicken Sie auf der vorherigen Registerkarte auf GitHub.com auf das Symbol "Diese Datei löschen" (es sieht aus wie ein Mülleimer).
      4. Stellen Sie sicher, dass das Optionsfeld "Direkt in den branchnameZweig übernehmen" ausgewählt ist, und klicken Sie auf die Schaltfläche "Änderungen festschreiben"
      5. Klicken Sie im selben Verzeichnis auf GitHub.com auf die Schaltfläche "Dateien hochladen"
      6. Laden Sie die umbenannte Datei von Ihrem Computer hoch
  5. Stellen Sie sicher, dass das Optionsfeld "Direkt in den branchnameZweig übernehmen" ausgewählt ist, und klicken Sie auf die Schaltfläche "Änderungen festschreiben"
  6. Vor Ort den Zweig auschecken / holen / ziehen
  7. Erledigt
gmeben
quelle
Ich habe direkt auf BitBucket umbenannt und es hat funktioniert. Vielen Dank.
rsc
Gut zu wissen. Diese Technik sollte theoretisch auf jeder Repository-Hosting-Plattform funktionieren, aber ich würde gerne wissen, ob es welche gibt, mit denen sie nicht funktionieren würde.
Gmeben
Funktioniert nicht für Dateien, die nicht im Browser bearbeitet werden können, wie Bilder oder PDFs. Offensichtlich gibt es keine Bearbeitungsoption.
Abhijit Sarkar
@AbhijitSarkar Guter Punkt. Ich habe meine Antwort für diese Fälle aktualisiert. Ich habe diese Anleitung getestet und überprüft.
Gmeben
Schafft es jemand, ein Verzeichnis auf diese Weise umzubenennen?
Solvitieg
20

Ähnlich wie bei @ Sijmens Antwort hat dies unter OSX beim Umbenennen eines Verzeichnisses für mich funktioniert (inspiriert von dieser Antwort aus einem anderen Beitrag):

git mv CSS CSS2
git mv CSS2 css

Das einfache Ausführen git mv CSS cssergab den ungültigen Argumentfehler: fatal: renaming '/static/CSS' failed: Invalid argumentVielleicht, weil das Dateisystem von OSX die Groß- und Kleinschreibung nicht berücksichtigt

ps Übrigens, wenn Sie Django verwenden, würde collectstatic den Fallunterschied ebenfalls nicht erkennen, und Sie müssten die oben genannten Schritte auch manuell im statischen Stammverzeichnis ausführen

Anupam
quelle
18

1) Datei umbenennen Name.jpginname1.jpg

2) Entfernen Sie die entfernte Datei Name.jpg

3) Datei umbenennen name1.jpginname.jpg

4) Die hinzugefügte Datei name.jpgzum vorherigen Commit ändern

git add
git commit --amend
Rasiermesser
quelle
2
Ich erhalte dies fatal: bad source, source=name1.jpg, destination=name.jpgin Schritt 3. Haben Sie einen Vorschlag? Thx
Anthony Kong
1
Sie können einfach kein Commit durchführen git add.
Alex78191
Sieht sehr hackig aus, nicht wahr? Oder Affenflicken.
Jeromej
18

Ich habe die folgenden Schritte ausgeführt:

git rm -r --cached .
git add --all .
git commit -a -m "Versioning untracked files"
git push origin master

Für mich ist das eine einfache Lösung

andrewvergel
quelle
Das ist die Lösung. Und im Gegensatz zu den anderen Antworten funktioniert es gut, wenn Sie Batch-Umbenennungen durchführen. Auf glamourphilly.org mussten wir jedes .Jpg in .jpg ändern. Im Finder können Sie solche Batch-Umbenennungen
vornehmen
11

Wir können den Befehl git mv verwenden. Beispiel unten: Wenn wir die Datei abcDEF.js in abcdef.js umbenannt haben, können wir den folgenden Befehl vom Terminal aus ausführen

git mv -f .\abcDEF.js  .\abcdef.js
Sandeep Shukla
quelle
8

Mac OSX High Sierra 10.13 behebt dies etwas. Erstellen Sie einfach eine virtuelle APFS-Partition für Ihre Git-Projekte. Standardmäßig gibt es keine Größenbeschränkung und keinen Speicherplatz.

  1. Klicken Sie im Festplatten-Dienstprogramm auf die Schaltfläche +, während die Container-Festplatte ausgewählt ist
  2. Wählen Sie unter Format APFS (Groß- und Kleinschreibung beachten) aus
  3. Nennen Sie es Sensitive
  4. Profitieren
  5. Optional: Erstellen Sie in Sensitive einen Ordner mit dem Namen gitundln -s /Volumes/Sensitive/git /Users/johndoe/git

Ihr Laufwerk wird in sein /Volumes/Sensitive/

Geben Sie hier die Bildbeschreibung ein

Wie kann ich nur Dateinamenänderungen in Git zwischen Groß- und Kleinschreibung unterscheiden?

Ray Foss
quelle
Ich liebe diesen Vorschlag, er löst das Problem elegant und schmerzlos, ohne auf hässliche Problemumgehungen zurückzugreifen. Vielen Dank!
Phil Gleghorn
4

Ich habe dieses Problem unter MacOS mehrmals gesehen. Git unterscheidet zwischen Groß- und Kleinschreibung, aber Mac bewahrt nur die Groß- und Kleinschreibung.

Jemand schreibt eine Datei fest Foobar.javaund beschließt nach einigen Tagen, sie in umzubenennen FooBar.java. Wenn Sie den neuesten Code abrufen, schlägt dies fehlThe following untracked working tree files would be overwritten by checkout...

Der einzige zuverlässige Weg, den ich gesehen habe, um dies zu beheben, ist:

  1. git rm Foobar.java
  2. Schreiben Sie eine Nachricht, die Sie nicht verpassen dürfen git commit -m 'TEMP COMMIT!!'
  3. ziehen
  4. Dies führt zu einem Konflikt, der Sie zwingt, den Konflikt zusammenzuführen - da Ihre Änderung ihn gelöscht hat, die andere Änderung ihn jedoch umbenannt hat (daher das Problem)
    1. Akzeptieren Sie Ihre Änderung, die die "Löschung" ist.
    2. git rebase --continue
  5. Lassen Sie jetzt Ihre Problemumgehung git rebase -i HEAD~2und dropdieTEMP COMMIT!!
  6. Bestätigen Sie, dass die Datei jetzt aufgerufen wird FooBar.java
Ashwin Jayaprakash
quelle
3

Wenn Sie viele Dateien umbenannt haben und einige davon nur eine Änderung des Gehäuses sind, ist es schwer zu merken, welches welches ist. Das manuelle "Verschieben" der Datei kann ziemlich aufwändig sein. Was ich also während meiner Aufgaben zur Änderung des Dateinamens tun würde, sind:

  1. Entfernen Sie alle Nicht-Git-Dateien und Ordner in einen anderen Ordner / Repository.
  2. Festschreiben des aktuellen leeren Git-Ordners (dies wird angezeigt, wenn alle Dateien gelöscht wurden.)
  3. Fügen Sie alle Dateien wieder in den ursprünglichen Git-Ordner / das ursprüngliche Repository ein.
  4. Festschreiben des aktuellen nicht leeren Git-Ordners.

Dadurch werden alle Fallprobleme behoben, ohne dass Sie herausfinden müssen, welche Dateien oder Ordner Sie umbenannt haben.

Ricardo Virtudazo Jr.
quelle
Warum nicht git commmit --amendin Absatz 4? Andernfalls wird beim Entfernen aller Dateien ein zusätzliches Commit ausgeführt. Oder Sie können git rebase -imit Kürbis verwenden.
Alex78191
1

Wenn nichts funktioniert hat, verwenden Sie git rm Dateiname, um die Datei von der Festplatte zu löschen und wieder hinzuzufügen.

Gopal Pandey
quelle
0

Ich nahm die Antwort von @CBarr und schrieb ein Python 3-Skript, um es mit einer Liste von Dateien zu tun:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import os
import shlex
import subprocess

def run_command(absolute_path, command_name):
    print( "Running", command_name, absolute_path )

    command = shlex.split( command_name )
    command_line_interface = subprocess.Popen( 
          command, stdout=subprocess.PIPE, cwd=absolute_path )

    output = command_line_interface.communicate()[0]
    print( output )

    if command_line_interface.returncode != 0:
        raise RuntimeError( "A process exited with the error '%s'..." % ( 
              command_line_interface.returncode ) )

def main():
    FILENAMES_MAPPING = \
    [
        (r"F:\\SublimeText\\Data", r"README.MD", r"README.md"),
        (r"F:\\SublimeText\\Data\\Packages\\Alignment", r"readme.md", r"README.md"),
        (r"F:\\SublimeText\\Data\\Packages\\AmxxEditor", r"README.MD", r"README.md"),
    ]

    for absolute_path, oldname, newname in FILENAMES_MAPPING:
        run_command( absolute_path, "git mv '%s' '%s1'" % ( oldname, newname ) )
        run_command( absolute_path, "git add '%s1'" % ( newname ) )
        run_command( absolute_path, 
             "git commit -m 'Normalized the \'%s\' with case-sensitive name'" % (
              newname ) )

        run_command( absolute_path, "git mv '%s1' '%s'" % ( newname, newname ) )
        run_command( absolute_path, "git add '%s'" % ( newname ) )
        run_command( absolute_path, "git commit --amend --no-edit" )

if __name__ == "__main__":
    main()
Benutzer
quelle