Bagaimana cara memindahkan repositori git ke direktori lain dan menjadikan direktori itu sebagai repositori git?

101

Saya memiliki direktori gitrepo1 . Direktori ini adalah repositori git.

  • Saya ingin memindahkan gitrepo1 ini ke direktori newrepo lain .

  • Direktori newrepo harus merupakan repositori git baru tanpa kehilangan histori git dan harus berisi direktori gitrepo1 .

  • Direktori gitrepo1 seharusnya hanya berupa direktori sekarang (di dalam newrepo ), tanpa .gitindeks apa pun , yaitu TIDAK lagi menjadi repositori git independen atau submodul.

Bagaimana saya bisa melakukan ini?

Pranjal Mittal
sumber
9
mv girepo1 newrepo??
ddavison

Jawaban:

110

Sangat sederhana. Git tidak peduli tentang apa nama direktorinya. Itu hanya peduli apa yang ada di dalamnya. Jadi, Anda cukup melakukan:

# copy the directory into newrepo dir that exists already (else create it)
$ cp -r gitrepo1 newrepo

# remove .git from old repo to delete all history and anything git from it
$ rm -rf gitrepo1/.git

Perhatikan bahwa penyalinan cukup mahal jika repositori besar dan dengan sejarah yang panjang. Anda juga dapat menghindarinya dengan mudah:

# move the directory instead
$ mv gitrepo1 newrepo

# make a copy of the latest version
# Either:
$ mkdir gitrepo1; cp -r newrepo/* gitrepo1/  # doesn't copy .gitignore (and other hidden files)

# Or:
$ git clone --depth 1 newrepo gitrepo1; rm -rf gitrepo1/.git

# Or (look further here: http://stackoverflow.com/q/1209999/912144)
$ git archive --format=tar --remote=<repository URL> HEAD | tar xf -

Setelah Anda membuatnya newrepo, tujuan yang akan diletakkan gitrepo1bisa di mana saja, bahkan di dalam newrepojika Anda menginginkannya. Itu tidak mengubah prosedur, hanya jalur yang Anda tulis gitrepo1kembali.

Shahbaz
sumber
6
+1. Mungkin perlu disebutkan bahwa gotcha ini memengaruhi repositori yang dibuat dengan git versi 1.7.8 atau 1.7.9 - yang berarti memindahkan repo git membuatnya tidak dapat digunakan (meskipun seperti yang ditunjukkan, mudah diperbaiki).
AD7six
1
Saya menggunakan mesin wndows dan menggunakan command prompt. saya tidak dapat menemukan perintah "cp". apakah perintah "cp" khusus untuk OS lain?
LP13
1
@ user3862378, cpseperti hampir setiap perintah atau fungsi dikhususkan untuk OS lain. Faktanya, ini khusus untuk setiap OS yang bukan windows. Coba hubungi microsoft dan tanyakan mengapa mereka bukan POSIX. Bagaimanapun, cpberarti menyalin. mvBerarti pindah. rmBerarti hapus. Anda dapat menemukan padanan windows.
Shahbaz
@Shahbaz Terima kasih, solusi di atas membuat struktur berikut "newrepo ->. Git" dan "newrepo-> semua file lain dari gitrepo1" ... itu tidak meletakkan folder "gitrepo1" di dalam "newrepo" .. saya penasaran apakah membuat folder secara manual di windows dan memindahkan folder ".git" di bawah folder root..akan bekerja tanpa mempengaruhi sejarah?
LP13
2
@ user3862378, tidak ada alasan untuk tidak melakukannya. .git/berisi semua riwayat, yang mencakup komit terbaru Anda. Dimanapun Anda meletakkannya, Anda memiliki semua sejarahnya. Faktanya, jika semua file di direktori itu berbeda dari repo asli tempat Anda mengambilnya .git/, satu-satunya hal adalah ia memberi tahu Anda beberapa file dihapus dan beberapa yang tidak terlacak ada. Dengan a git reset --hard, file yang dihapus akan dipulihkan secara otomatis! Satu-satunya hal yang perlu diperhatikan adalah bahwa hanya dengan menyalin .git/Anda tidak dapat memulihkan perubahan yang tidak terikat.
Shahbaz
4

Agak terlambat dan pertanyaannya sudah terjawab tetapi, untuk melakukannya tanpa sakit kepala:

  1. Lihat apa cabang Anda saat ini di folder git yang lebih lama git status, katakanlah pengembangan cabang
  2. Ubah direktori ke folder git baru, lalu git cloneproyek dari repo ke folder baru
  3. Lihat cabang saat ini di folder baru Anda: git checkout development
  4. Sinkronkan folder baru Anda dengan yang lama, menggunakan rsync, tidak termasuk folder .git :rsync -azv --exclude '.git' gitrepo1 newrepo/gitrepo1

Maka Anda baik untuk melanjutkan di mana Anda tinggalkan

emremrah
sumber
2

Bahkan lebih sederhana dari itu. Baru saja melakukan ini (di Windows, tetapi seharusnya berfungsi di OS lain):

  1. Buat repo baru .
  2. Pindahkan gitrepo1 ke repo baru .
  3. Pindahkan .git dari gitrepo1 ke newrepo (naik satu level).
  4. Lakukan perubahan (perbaiki pelacakan sesuai kebutuhan).

Git baru saja melihat Anda menambahkan direktori dan mengganti nama banyak file. Bukan masalah besar.

david.pfx
sumber
1

Saya bukan ahli, tetapi saya menyalin folder .git ke folder baru, lalu menjalankan: git reset --HARD

Boot Ulang Semesta
sumber