wake-up-neo.com

git mv und ändere nur die Schreibweise des Verzeichnisses

Während ich eine ähnliche Frage fand , fand ich keine Antwort auf mein Problem

Wenn ich versuche, das Verzeichnis über git mv FOO foo Von FOO in foo umzubenennen, erhalte ich

fatal: renaming 'FOO' failed: Invalid argument

OKAY. Also versuche ich git mv FOO foo2 && git mv foo2 foo

Aber wenn ich versuche, ein Commit über git commit . Durchzuführen, bekomme ich

# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
# foo
nothing added to commit but untracked files present (use "git add" to track)

Wenn ich das Verzeichnis über git add foo Hinzufüge, ändert sich nichts und git commit . Gibt mir dieselbe Meldung erneut.

Was mache ich falsch? Ich dachte, ich benutze ein OSX-System (case-sensitive system). Warum kann ich das Verzeichnis nicht einfach umbenennen?

247
oschrenk

Sie sind in einer Umgebung ohne Berücksichtigung der Groß- und Kleinschreibung. Weiteres Hinzufügen ohne das -A kümmert sich nicht um die Löschseite von mv, wie Git es versteht. Warnung! Stellen Sie sicher, dass keine anderen Änderungen oder nicht verfolgten Dateien vorhanden sind, wenn Sie dies tun, oder sie werden als Teil dieser Änderung festgeschrieben! git stash -u zuerst dies tun und dann git stash pop nach. Fortsetzung: Um dies zu umgehen, gehen Sie wie folgt vor:

mv foo foo2
git add -A
git commit -m "renaming"
mv foo2 FOO
git add -A
git commit --amend -m "renamed foo to FOO"

Das ist der langwierige Weg, das Arbeitsverzeichnis zu ändern, die beiden Commits zu bestätigen und dann zu reduzieren. Sie können die Datei einfach in den Index verschieben, aber für jemanden, der neu in Git ist, ist es möglicherweise nicht explizit genug, was passiert. Die kürzere Version ist

git mv foo foo2
git mv foo2 FOO
git commit -m "changed case of dir"

Wie in einem der Kommentare vorgeschlagen, können Sie auch eine interaktive Rebase (git rebase -i HEAD~5 wenn der falsche Fall vor 5 Commits eingeführt wurde), um den Fall dort zu beheben und den falschen Fall an keiner Stelle in der Historie erscheinen zu lassen. Sie müssen vorsichtig sein, wenn Sie dies tun, da die Commit-Hashes von da an anders sind und andere ihre Arbeit mit der jüngsten Vergangenheit des Zweigs neu zusammenführen müssen.

Dies hängt mit dem Korrigieren des Dateinamens zusammen: nterscheidet Git nicht zwischen Groß- und Kleinschreibung?

383
Adam Dymitruk

Sie möchten die Option core.ignorecase Auf false setzen, wodurch Git die Groß- und Kleinschreibung auf Dateisystemen beachtet, die dies nicht nativ unterstützen. So aktivieren Sie in Ihrem Repo:

$ git config core.ignorecase false

Dann können Sie die Datei mit git mv Umbenennen und sie funktioniert wie erwartet.

139
mipadi

Ich konnte dies mithilfe von Git 1.7.7 mithilfe eines temporären Dateinamens beheben:

$ git mv improper_Case improve_case2
$ git mv improve_case2 improve_case
$ git commit -m "<your message>"
58
mgadda

(git mv - kostenlose Variante.)

Ich bin auf dieses Problem in Git unter Mac OS X 10.9 gestoßen. Ich habe es wie folgt gelöst:

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

Das bereitet das Verzeichnis zum Löschen in Git vor, entfernt jedoch keine physischen Dateien (--cached). Dadurch wird das Verzeichnis jetzt mit der richtigen Groß-/Kleinschreibung auch in nicht verfolgten Dateien angezeigt.

So können Sie dies tun:

mv /path/to/directory /path/to/DIRECTORY
git add -A /path/to/DIRECTORY

Git erkennt dann, dass Sie die Dateien umbenannt haben, und wenn Sie git status Ausführen, sollten Sie eine Reihe von renamed: - Zeilen sehen. Überprüfen Sie sie und stellen Sie sicher, dass sie korrekt aussehen. In diesem Fall können Sie die Änderungen normal übernehmen.

13
wizonesolutions

Erzwinge es mit der Option -f:

git mv -f FOO foo
8
konyak

Dies ist eine schnelle und fehlerfreie Lösung:

git mv -f path/to/foo/* path/to/FOO/

Warnung! Benennen Sie immer alle Dateien im umbenannten Ordner um (verwenden Sie /*).

Benennen Sie einzelne Dateien nicht um. Dies führt zu einem Fehler, der in diesem Antwort beschrieben wird.

Wenn Sie das Ergebnis zuerst sehen möchten, verwenden Sie -n:

git mv -f -n path/to/foo/* path/to/FOO/

Nachdem Sie ein mv erstellt haben:

  1. Änderungen übernehmen
  2. Kasse zu einer anderen Revision
  3. Kasse zurück.

Jetzt sollte Git den Ordner BOTH in seinen internen Dateien und im Dateisystem umbenannt haben.

8
Nick Volynkin

Sie verwenden unter OS X kein Dateisystem, bei dem zwischen Groß- und Kleinschreibung unterschieden wird, es sei denn, Sie wählen dies ausdrücklich aus. Bei HFS + kann zwischen Groß- und Kleinschreibung unterschieden werden, bei der Standardeinstellung wird jedoch die Groß- und Kleinschreibung nicht berücksichtigt.

2
Nicholas Knight

Ich hatte ein ähnliches Problem.

Ein Ordner mit dem Namen "Pro" (zuerst erstellt) und ein anderer "Pro" (versehentlich erstellt). In Mac ist es das gleiche, aber je nach Git unterschiedlich.

$ git config core.ignorecase false

die git config benennt die dateien in den richtigen ordner um (danke) und erstellt auch ghost files in 'pro' (nein !!). Ich konnte dem Track keine Ghost-Datei-Änderungen hinzufügen und andere Zweige nicht auschecken, es sei denn, ich habe diese Dateien bei mir und ich konnte sie auch nicht zurücksetzen.

Stattdessen habe ich getan

$ git rm -r --cached pro
$ git status // => pro files removed, new Pro files untracked
$ git add Pro

Um es besonders sicher zu machen, habe ich es in einem separaten Fix-Zweig gemacht und dann wieder in den Hauptzweig zurückgeführt

Kann ein Guru für das von erstellte Ghost-File-Problem erklären, wie und warum? Danke im Voraus.

2
Liang

Hier ist eine wirklich einfache Lösung für alle Fehler auf dieser Seite.

  1. Kopieren Sie die Dateien manuell aus Ihrem Projekt.
  2. git rm alle dateien.
  3. git Commit wie gewohnt.
  4. fügen Sie die Dateien manuell wieder hinzu.
  5. git füge alle Dateien hinzu.
  6. git Commit wie gewohnt.
  7. profitieren.
1
Askdesigners

Wenn Sie die Antwort von Adam Dymitruk verbessern (dumm, dass SO lässt mich seine Antwort nicht kommentieren), werden mit "git mv" automatisch genau die verschobenen Dateien inszeniert -A "kann vermieden werden:

old="abc";    new="ABC";
tmp="$old-renamed";
git mv "$old" "$tmp";
git commit -m "Renamed '$old' to '$tmp'.";
git mv "$tmp" "$new";
git commit --amend -m "Renamed '$old' to '$new'.";
0
Rainer Blome