Befehl git zum Verschieben eines Ordners in einen anderen


193

Ich habe einen Ordner commonmit einer Reihe von Quelldateien und Ordnern erstellt.

Jetzt möchte ich den commonOrdner in den includeOrdner verschieben, damit er so aussiehtinclude/common

Ich habe diese ausprobiert:

  1. git add include

  2. git mv common/ include/

    aber es schlägt mit diesem Fehler fehl

    fatal: schlechte Quelle, Quelle = myrepo / common, Ziel = myrepo / include

  3. Ich habe es versucht, git mv common/ include/commonaber ich bekomme den gleichen Fehler

Irgendeine Idee, wie man das erreicht?

Antworten:


177

Eines der schönsten Dinge an Git ist, dass Sie das Umbenennen von Dateien nicht explizit verfolgen müssen. Git wird es herausfinden, indem er den Inhalt der Dateien vergleicht.

Arbeiten Sie in Ihrem Fall also nicht so hart:

$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common

Laufen git statussollte dir so etwas zeigen:

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    common/file.txt -> include/common/file.txt
#

43
Dies funktioniert bei mir nicht (unter Windows 7, 1.7.6.msysgit.0). Git glaubt, dass alte Dateien gelöscht und neue Dateien hinzugefügt wurden.
Bart

Hmm, vielleicht verwendet Git ein externes Dienstprogramm, um die Gleichheit der Dateien zu bestimmen, die unter Windows nicht funktioniert. Dies war ein Kernstück der Implementierung von git.
Andres Jaan Tack

13
@OliverF. Korrektur: git mvist gleichwertig.
Andres Jaan Tack

25
"Eines der schönsten Dinge an git" - einer der Nachteile dieser netten Funktion ist, dass sie fehlschlägt, wenn Sie auch die Datei ändern, die in erheblichem Umfang umbenannt wurde, wodurch eine neue Datei gelöscht und hinzugefügt wird Ehrlich gesagt würde ich stattdessen eine explizite Unterstützung für das Umbenennen bevorzugen.
Erik Kaplun

2
Wenn git Zeilenenden konvertiert, führt dies zu dem von @Bart beschriebenen Problem. Damit dies funktioniert, müssen Sie Folgendes tun: git config --global core.autocrlf false
Mariano Dupont

162
 git mv common include

sollte arbeiten.

Von der git mvManpage :

git mv [-f] [-n] [-k] <source> ... <destination directory>

In der zweiten Form muss das letzte Argument ein vorhandenes Verzeichnis sein. Die angegebenen Quellen werden in dieses Verzeichnis verschoben .
Der Index wird nach erfolgreichem Abschluss aktualisiert, die Änderung muss jedoch noch festgeschrieben werden.

Nein "git addVor dem Umzug sollte " erfolgen .


Hinweis: " git mv A B/", wannB es nicht als Verzeichnis vorhanden ist, sollte ein Fehler auftreten, dies ist jedoch nicht der Fall.

Siehe Commit c57f628 von Matthieu Moy ( moy) für Git 1.9 / 2.0 (Q1 2014):

Git hat den abschließenden Schrägstrich gekürzt und den Befehl auf 'gesetztgit mv file no-such-dir ' gesetzt, wodurch die Datei erstellt wurde no-such-dir(während der abschließende Schrägstrich ausdrücklich angab, dass es sich nur um ein Verzeichnis handeln kann).

Dieser Patch überspringt das Entfernen von nachgestellten Schrägstrichen für den Zielpfad.
Der Pfad mit seinem abschließenden Schrägstrich wird an die Umbenennung (2) übergeben.

$ git mv file no-such-dir/
fatal: renaming 'file' failed: Not a directory

2
Perfekt funktioniert - und die Verwendung git mvscheint viel besser zu sein!
Tomas Petricek

23

Befehl:

$ git mv oldFolderName newFolderName

Es funktioniert normalerweise gut.

Der Fehler "Bad Source ..." zeigt normalerweise an, dass nach dem letzten Festschreiben einige Umbenennungen im Quellverzeichnis vorhanden waren und daher git mvdie erwartete Datei nicht gefunden werden kann.

Die Lösung ist einfach - erst vor der Bewerbung festschreiben git mv.


15

Stellen Sie sicher, dass Sie alle Änderungen zum Staging-Bereich hinzugefügt haben, bevor Sie ausgeführt werden

git mv oldFolderName newFoldername

Git schlägt mit Fehler fehl

fatal: bad source, source=oldFolderName/somepath/somefile.foo, destination=newFolderName/somepath/somefile.foo

Wenn es nicht hinzugefügte Dateien gibt, habe ich es gerade herausgefunden.


"Wenn es nicht hinzugefügte Dateien gibt, habe ich es gerade herausgefunden." - Vielen Dank!
Cacoder

3

Eine andere Möglichkeit, alle Dateien in einem Verzeichnis in ein Unterverzeichnis zu verschieben (behält den Git-Verlauf bei):

$ for file in $(ls | grep -v 'subDir'); do git mv $file subDir; done;


3

Ich hatte ein ähnliches Problem damit, git mvwo ich den Inhalt eines Ordners in einen vorhandenen Ordner verschieben wollte, und endete mit diesem "einfachen" Skript:

pushd common; for f in $(git ls-files); do newdir="../include/$(dirname $f)"; mkdir -p $newdir; git mv $f $newdir/$(basename "$f"); done; popd

Erläuterung

  • git ls-files: Finde alle Dateien (im commonOrdner), die in git eingecheckt sind
  • newdir="../include/$(dirname $f)"; mkdir -p $newdir;: Erstellen Sie einen neuen Ordner innerhalb des includeOrdners mit derselben Verzeichnisstruktur wiecommon
  • git mv $f $newdir/$(basename "$f"): Verschieben Sie die Datei in den neu erstellten Ordner

Der Grund dafür ist, dass git anscheinend Probleme beim Verschieben von Dateien in vorhandene Ordner hat. Dies schlägt auch fehl, wenn Sie versuchen, eine Datei in einen nicht vorhandenen Ordner zu verschieben (daher) mkdir -p ).

Das Schöne an diesem Ansatz ist, dass er nur Dateien berührt, die bereits in git eingecheckt sind. Wenn Sie einfach git mveinen ganzen Ordner verschieben und der Ordner nicht bereitgestellte Änderungen enthält, weiß Git nicht, was zu tun ist.

Nach dem Verschieben der Dateien möchten Sie möglicherweise das Repository bereinigen , um alle verbleibenden nicht bereitgestellten Änderungen zu entfernen. Denken Sie daran, zuerst einen Trockenlauf durchzuführen!

git clean -fd -n

2

Es tut mir leid, dass ich nicht genug Ruf habe, um die "Antwort" von "Andres Jaan Tack" zu kommentieren.

Ich denke, meine Nachricht wird gelöscht ((Aber ich möchte nur "lurscher" und andere warnen, die den gleichen Fehler haben: seien Sie vorsichtig)

$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common

Dies kann dazu führen, dass Sie den Git-Verlauf Ihres Projekts nicht in einem neuen Ordner sehen.

ich habe versucht

$ git mv oldFolderName newFolderName

bekam

fatal: bad source, source=oldFolderName/somepath/__init__.py, dest
ination=ESWProj_Base/ESWProj_DebugControlsMenu/somepath/__init__.py

Ich tat

git rm -r oldFolderName

und

git add newFolderName

und ich sehe keine alte Git-Geschichte in meinem Projekt. Zumindest geht mein Projekt nicht verloren. Jetzt habe ich mein Projekt in newFolderName, aber ohne den Verlauf (

Ich möchte nur warnen, sei vorsichtig mit den Ratschlägen von "Andres Jaan Tack", wenn du dein Git-Hsitory nicht verlieren willst.


Stellen Sie sicher, dass alle Ihre Änderungen hinzugefügt wurden. Git sagt nicht "schlechte Quelle", wenn es nicht hinzugefügte Änderungen gibt, also habe ich es gerade herausgefunden.
Kevin Pluck

0

Ich hatte ein ähnliches Problem, aber in einem Ordner, den ich verschieben wollte, hatte ich Dateien, die ich nicht verfolgte.

Nehmen wir an, ich hätte Dateien

a/file1
a/untracked1
b/file2
b/untracked2

Und ich wollte nur verfolgte Dateien in einen Unterordner verschieben subdir, also war das Ziel:

subdir/a/file1
subdir/a/untracked1
subdir/b/file2
subdir/b/untracked2

was ich getan hatte war:

  • Ich habe einen neuen Ordner erstellt und alle Dateien verschoben, die ich verschieben wollte: mkdir tmpdir && mv a b tmpdir
  • alte Dateien ausgecheckt git checkout a b
  • hat ein neues Verzeichnis erstellt und saubere Ordner (ohne nicht verfolgte Dateien) in ein neues Unterverzeichnis verschoben: mkdir subdir && mv a b subdir
  • fügte alle Dateien aus dem Unterverzeichnis hinzu (so dass Git nur zuvor verfolgte Dateien hinzufügen konnte - es war eine Art git add --updatemit Verzeichniswechsel- Trick ):git add subdir (normalerweise würde dies sogar nicht verfolgte Dateien hinzufügen - dies würde das Erstellen einer .gitignoreDatei erfordern )
  • git status zeigt jetzt nur verschobene Dateien
  • Restliche Dateien von tmpdir nach subdir verschoben: mv tmpdir/* subdir
  • git statussieht aus wie wir hingerichtet haben git mv:)

-1

Ich habe dies unter Windows folgendermaßen gelöst:

  • Öffnen Sie die Power Shell-Konsole
  • lauf dir
  • Klicken Sie bei gedrückter Alt-Taste und ziehen Sie sie über die Datei- / Ordnernamensspalte
  • In Notepad ++ einfügen
  • Ausführen Ersetzen durch Regex: Ersetzen (.*)durchgit mv ".\\\1" ".\\<New_Folder_Here>\"
  • Kopieren Sie den gesamten Text aus Notepad ++ in Powershell
  • drücke Enter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.