perintah git untuk memindahkan folder ke dalam folder lain

193

Saya telah membuat folder common dengan banyak file sumber dan folder.

Sekarang saya ingin memindahkan commonfolder ke includefolder sehingga terlihat sepertiinclude/common

Saya mencoba ini:

  1. git add include

  2. git mv common/ include/

    tetapi gagal dengan kesalahan ini

    fatal: sumber buruk, sumber = myrepo / common, destination = myrepo / include

  3. Saya mencoba git mv common/ include/commontetapi saya mendapatkan kesalahan yang sama

Adakah yang tahu bagaimana mencapainya?

lurscher
sumber

Jawaban:

177

Salah satu hal terbaik tentang git adalah Anda tidak perlu melacak nama file secara eksplisit. Git akan mencari tahu dengan membandingkan isi file.

Jadi, dalam kasus Anda, jangan bekerja terlalu keras:

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

Berlari git statusakan menunjukkan sesuatu seperti ini kepada Anda:

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    common/file.txt -> include/common/file.txt
#
Andres Jaan Tack
sumber
43
Ini tidak berfungsi untuk saya (menggunakan Windows 7, 1.7.6.msysgit.0). Git berpikir file lama telah dihapus dan file baru ditambahkan.
Bart
Hmm, mungkin git menggunakan beberapa utilitas eksternal untuk menentukan kesamaan file yang tidak berfungsi pada Windows? Ini adalah bagian inti dari implementasi git.
Andres Jaan Tack
13
@OliverF. Koreksi: git mvsetara.
Andres Jaan Tack
25
"Salah satu hal terbaik tentang git" - salah satu kelemahan dari fitur bagus ini adalah bahwa ia mulai gagal ketika Anda juga memodifikasi file yang diubah namanya menjadi sangat besar, yang menyebabkannya melihat penghapusan dan penambahan file baru , terus terang, saya lebih suka mengganti nama dukungan eksplisit.
Erik Kaplun
2
Jika git mengonversi akhir baris, ini menghasilkan masalah yang dijelaskan oleh @Bart. Agar ini berfungsi, Anda harus melakukan yang berikut: git config --global core.autocrlf false
Mariano Dupont
162
 git mv common include

harus bekerja.

Dari git mvhalaman manual :

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

Dalam bentuk kedua, argumen terakhir harus berupa direktori yang ada; sumber yang diberikan akan dipindahkan ke direktori ini .
Indeks diperbarui setelah berhasil diselesaikan, tetapi perubahan masih harus dilakukan.

" git add" Tidak harus dilakukan sebelum pindah.


Catatan: " git mv A B/", saatB tidak ada sebagai direktori, seharusnya kesalahan keluar, tetapi tidak ada.

Lihat commit c57f628 oleh Matthieu Moy ( moy) untuk Git 1.9 / 2.0 (Q1 2014):

Git digunakan untuk memangkas trailing slash, dan membuat perintah yang setara dengan ' git mv file no-such-dir', yang membuat file no-such-dir(sementara trailing slash secara eksplisit menyatakan bahwa itu hanya bisa berupa direktori).

Patch ini melewatkan penghapusan garis miring trailing untuk jalur tujuan.
Jalur dengan garis miringnya dilewatkan untuk mengganti nama (2), yang salah dengan pesan yang sesuai:

$ git mv file no-such-dir/
fatal: renaming 'file' failed: Not a directory
VONC
sumber
2
Bekerja dengan sempurna - dan menggunakan git mvtampilan seperti pendekatan yang jauh lebih baik!
Tomas Petricek
23

Perintah:

$ git mv oldFolderName newFolderName

Biasanya berfungsi dengan baik.

Kesalahan "sumber buruk ..." biasanya menunjukkan bahwa setelah komit terakhir ada beberapa nama baru di direktori sumber dan karenanya git mv tidak dapat menemukan file yang diharapkan.

Solusinya sederhana - cukup komit sebelum mendaftar git mv.

Igor Zvorygin
sumber
15

Pastikan Anda telah menambahkan semua perubahan Anda ke area pementasan sebelum berjalan

git mv oldFolderName newFoldername

git gagal dengan kesalahan

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

jika ada file yang belum ditambahkan, jadi saya baru tahu.

Kevin Pluck
sumber
"Jika ada file yang tidak ditambahkan, jadi saya baru tahu." - terima kasih!
cacoder
3

Cara lain untuk memindahkan semua file dalam direktori ke sub direktori (membuat sejarah git):

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

Michael Smolenski
sumber
3

Saya memiliki masalah yang serupa dengan di git mvmana saya ingin memindahkan konten dari satu folder ke folder yang ada, dan berakhir dengan skrip "sederhana" ini:

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

Penjelasan

  • git ls-files: Temukan semua file (dalam commonfolder) diperiksa ke git
  • newdir="../include/$(dirname $f)"; mkdir -p $newdir;: Buat folder baru di dalam includefolder, dengan struktur direktori yang sama dengancommon
  • git mv $f $newdir/$(basename "$f"): Pindahkan file ke folder yang baru dibuat

Alasan untuk melakukan ini adalah bahwa git tampaknya memiliki masalah memindahkan file ke folder yang ada, dan itu juga akan gagal jika Anda mencoba untuk memindahkan file ke folder yang tidak ada (karenanya mkdir -p ).

Yang menyenangkan tentang pendekatan ini adalah hanya menyentuh file yang sudah diperiksa untuk git. Dengan hanya menggunakan git mvuntuk memindahkan seluruh folder, dan folder tersebut berisi perubahan yang tidak dipentaskan, git tidak akan tahu apa yang harus dilakukan.

Setelah memindahkan file, Anda mungkin ingin membersihkan repositori untuk menghapus perubahan yang belum dipentaskan yang tersisa - ingat untuk mengeringkan dulu!

git clean -fd -n
loket
sumber
2

Maaf saya tidak memiliki reputasi yang cukup untuk mengomentari "jawaban" dari "Andres Jaan Tack".

Saya pikir messege saya akan dihapus ((Tapi saya hanya ingin memperingatkan "lurscher" dan orang lain yang mendapat kesalahan yang sama: hati-hati melakukan

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

Ini dapat menyebabkan Anda tidak akan melihat riwayat git proyek Anda di folder baru.

Saya mencoba

$ git mv oldFolderName newFolderName

dapatkan

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

aku melakukannya

git rm -r oldFolderName

dan

git add newFolderName

dan saya tidak melihat sejarah git tua di proyek saya. Setidaknya proyek saya tidak hilang. Sekarang saya memiliki proyek saya di newFolderName, tetapi tanpa sejarah (

Hanya ingin memperingatkan, hati-hati menggunakan saran "Andres Jaan Tack", jika Anda tidak ingin kehilangan git hsitory Anda.

Ivan F.
sumber
Pastikan semua perubahan Anda telah ditambahkan. Git gagal mengatakan "sumber buruk" jika ada perubahan yang tidak ditambahkan, jadi saya baru tahu.
Kevin Pluck
0

Saya memiliki masalah yang sama, tetapi dalam folder yang ingin saya pindahkan saya memiliki file yang tidak saya lacak.

katakanlah saya punya file

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

Dan saya ingin memindahkan hanya file yang dilacak ke subfolder subdir, jadi tujuannya adalah:

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

apa yang telah saya lakukan adalah:

  • Saya membuat folder baru dan memindahkan semua file yang saya tertarik untuk dipindahkan: mkdir tmpdir && mv a b tmpdir
  • memeriksa file lama git checkout a b
  • membuat direktori baru dan memindahkan folder bersih (tanpa file tidak terlacak) ke subdirektori baru: mkdir subdir && mv a b subdir
  • menambahkan semua file dari subdir (sehingga Git dapat menambahkan hanya file yang dilacak sebelumnya - itu adalah semacam trikgit add --update perubahan direktori ): (biasanya ini akan menambahkan file yang bahkan tidak terlacak - ini akan membutuhkan pembuatan file)git add subdir.gitignore
  • git status menunjukkan sekarang hanya memindahkan file
  • memindahkan sisa file dari tmpdir ke subdir: mv tmpdir/* subdir
  • git statusSepertinya kita dieksekusi git mv:)
test30
sumber
-1

Saya memecahkan ini di windows dengan melakukan ini:

  • Buka konsol shell daya
  • jalankan dir
  • Alt-klik dan seret ke kolom nama file / folder, lalu salin
  • Rekatkan ke notepad ++
  • jalankan ganti dengan regex: ganti (.*)dengangit mv ".\\\1" ".\\<New_Folder_Here>\"
  • salin semua teks dari notepad ++ ke PowerShell
  • tekan enter
FalcoGer
sumber