Repositori Git saya berada di direktori root yang salah. Bisakah saya memindahkannya? (../ dari pada ./)

118

Entah bagaimana ketika saya git initmengedit proyek terbaru saya sekitar sebulan yang lalu saya menjalankan perintah di direktori satu direktori lebih tinggi dari root proyek saya.

Jadi repositori saya ada di ./projectdirektori dan bukan di ./project/my-new-projectdirektori. Saya tidak tahu bagaimana saya tidak menyadari masalah ini sebelumnya, tetapi saya tidak pernah mencari direktori .git sampai sekarang.

Adakah cara, tanpa menghentikan proyek saya, untuk memindahkan repositori ke direktori yang benar dan kemudian memberi tahu git apa basis baru dari proyek tersebut? Memindahkan direktori saja tidak akan berhasil. Git mengira semua file telah dihapus.

Mike
sumber

Jawaban:

19

Mungkin hal yang paling sederhana, kecuali Anda telah membuat beberapa riwayat yang ingin Anda simpan, adalah dengan hanya menghapus .gitsubdirektori dan mengulang init di direktori yang benar.

Jika Anda menggunakan git untuk memecahkan masalah, solusi apa pun pasti akan meninggalkan banyak entri riwayat "memindahkan file ini ke sini" yang sebenarnya tidak berubah, tetapi Anda memperbaiki kekacauan pada saat pembuatan. Lebih baik buat saja dengan benar.

TED
sumber
2
Saya mengerti apa yang Anda katakan, tetapi setiap tindakan in-git yang Anda lakukan untuk memperbaikinya akan berakhir dengan meninggalkan sekumpulan riwayat "memindahkan file ini ke sini" yang sebenarnya tidak berubah, tetapi Anda memperbaiki kekacauan pada waktu pembuatan. Lebih baik buat saja dengan benar.
TED
8
Ini merusak banyak hal. stackoverflow.com/a/3247756/825364 adalah cara yang jauh lebih baik untuk melakukannya.
Steve Tauber
2
Nah, menyimpan beberapa sejarah untuk apa Git digunakan. Mungkin kita harus menghapus subdirektori .git dan menghapus Git dari sistem kita? Menggunakan ftp-server daripada vcs mungkin adalah hal yang paling sederhana!
Gherman
2
jawaban di bawah ini adalah pendekatan yang jauh lebih baik karena mempertahankan semua sejarah
BigMikeW
2
Jadi bagi saya, saya melakukan ini dan segera menyadari kesalahan saya. tanpa perlu mengkhawatirkan perubahan apa pun, ini adalah cara termudah untuk kembali ke keadaan semula.
Mike
261

Saya mengalami masalah sebaliknya - harus menggeser git root ke direktori induk (dari project / src ke project) Yang sangat mengejutkan saya, berikut ini berhasil !!

src$ mv .git ../ 
src$ cd ..
project$ git add src
project$ git commit -a

git dengan cerdik mendeteksi bahwa semua file baru diganti namanya menjadi versi lama dan tidak ada riwayat yang hilang

Anda dapat mencoba sesuatu yang serupa ... pindahkan folder .git dan tambahkan file lagi sebelum melakukannya

Abhishek Anand
sumber
8
Ini bekerja dengan sempurna untuk saya. Saya juga memindahkan file .git * config lainnya dari direktori seperti .gitigore
Relequestual
7
Tuan tersayang, Anda adalah penyelamat hidup. Hal ini benar-benar BERFUNGSI. Terima kasih.
Radu Murzea
1
Selain itu, saya git rm'dfile dari lokasi lama mereka, jadi git status(dengan benar) akhirnya melaporkan sejumlah operasi ganti nama. Semakin saya bekerja dengan git, semakin saya menyukainya.
ssc
7
@ Mike ini harus ditandai sebagai jawaban yang diterima. Ini adalah solusi yang lebih disukai untuk masuk kembali karena Anda tidak kehilangan riwayat. Jika Anda tidak mempercayai saya, jumlah suara positif berbicara sendiri.
Joseph Spens
3
Terima kasih! Ini berhasil untuk saya, tetapi saya harus melakukan beberapa hal lagi: 1. Sebelum melakukan, saya memperbarui .gitignoredan menjalankan git add -Adi folder root; setelah ini, git menampilkan semua file dengan benar, renamedbukan deleted. 2. Karena saya menggunakan submodul, saya harus pindah .gitmoduleske root baru, dan memperbarui jalur submodul di berbagai file konfigurasi git. Untuk menemukan file mana yang akan dimodifikasi, saya menjalankangrep -nrI --color 'old/path/to/submodule' .
Guido Walter Pettinari
43

Ini berhasil untuk saya, dan menjaga semua sejarah saya tetap utuh. Dari folder akar yang salah (induk tempat Anda tidak sengaja menginisialisasi repo):

Pindahkan folder:

mv .git thecorrectfolder/

Inisialisasi ulang repo git:

cd thecorrectfolder/
git init

Tambahkan kembali semua file, komit, dan dorong:

git add .
git commit -am 'fixing things'
git push origin master

Selesai! Dapatkan bir untuk dirimu sendiri.

Saat Anda menjalankan repo git setelah menginisialisasi ulang, Anda akan mendapatkan banyak keluaran yang terlihat seperti ini:

rename {ethanode/coffee => coffee}/app.coffee (100%)

Dengan kata lain, semua referensi Anda dari folder induk dan diubah namanya untuk menggunakan folder yang benar.

holmesal.dll
sumber
Terima kasih! Metode ini persis seperti yang saya butuhkan!
Giel Berkers
Ini berhasil untuk saya, tetapi sedikit jelek. Sejauh menyangkut git, saya tidak 'memindahkan' apa pun, saya hanya menghapus ratusan file dan kemudian menambahkan ratusan file identik lainnya.
bjmc
6
git init tidak diperlukan dan bagian yang tersisa sama dengan jawaban saya yang dikirimkan bertahun-tahun sebelum jawaban Anda: stackoverflow.com/a/3247756/391753
Abhishek Anand
35

git filter-branchmemungkinkan Anda menulis ulang sejarah dengan cara itu. The git filter-branchman page bahkan memiliki kasus Anda sebagai contoh :

Untuk menulis ulang repositori agar terlihat seolah-olah foodir / telah menjadi root proyeknya, dan buang semua histori lainnya:

git filter-branch --subdirectory-filter foodir -- --all

Anda mungkin ingin git clonerepo ke subdirektori baru sebelum (atau setelah?) git filter-branchDijalankan. (Mengkloning sebelum cabang-filter dan menjalankan cabang-filter pada klon baru akan memiliki keuntungan meninggalkan .git/dir asli di tempat sebagai cadangan jika terjadi kesalahan.)

ndim
sumber
1
Ini tidak "membuang semua riwayat lainnya " (menyarankan .gitrepo tetap di tingkat atas sementara subdirektori menjadi "dianggap sebagai root") - ini benar-benar akan membuang semua file lain di repo, dan memindahkan semua subdirectory/*file ke folder root .
Louis Maddox
Jawaban yang bagus, tetapi perlu diingat bahwa jika ada file .gitignore (jika dilacak), itu akan hilang dengan operasi ini. Selain itu, Anda harus melakukan git push --forceuntuk mengupdate repositori upstream setelah ini.
waldyrious
12

Git dapat mengingat file dengan hashnya,

Pindahkan saja Anda .gitke direktori root dan beri tahu gituntuk mengingat semua file berubah dengan --allopsi.

$ mv .git ../
$ cd ..
$ git add . --all 
$ git status // => you can see all the files recognized as renamed 100%
$ git commit -m "Moves repo to root directory."
M. Reza Nasirloo
sumber
3

Gunakan git-mvuntuk memindahkan file Anda "ke atas" ke lokasi yang benar, lalu git-rmke direktori "proyek-baru-saya".

jkndrkn.dll
sumber
Ini sebaliknya. Saya tidak ingin memindahkan semua file saya ke direktori git berada (ada banyak hal lain di sana ... itu akan mengganggu) dan kemudian memindahkan git ke atas. Saya ingin memindahkan repositori ke direktori root proyek saya.
Mike
2

Saya datang ke sini mencari cara untuk memindahkan repositori saya ke mana saja .

Seandainya, saya bukan satu-satunya, inilah yang pada akhirnya saya lakukan:

https://git.wiki.kernel.org/index.php/GitFaq#How_do_I_clone_a_repository_with_all_remotely_tracked_branches.3F Saya "git clone --mirror" da salinan kosong dari repo saya dan setelah itu menyuruhnya untuk tidak kosong lagi, sehingga file muncul di folder baru itu. (Kemudian periksa apakah file dan log telah muncul atau tidak.) Simpan repo lama untuk sementara, untuk berjaga-jaga ...

Dengan cara itu saya bisa memindahkan repo saya tanpa kehilangan sejarah.

Salam Hormat, Dinah

pengguna1565849
sumber
Koreksi saya jika saya salah, tetapi tampaknya Anda dapat melakukannya hanya dengan memindahkan direktori repositori ke posisi yang ditentukan hanya dengan menggunakan alat sistem file kosong, seperti mv /path/to/the/old/location/of/the/repo /path/to/the/new/location/of/the/repo.
cueedee
2

Baru saja melalui masalah yang sama ini, solusi akhirnya saya adalah:

  1. Pindahkan folder .git ke tempatnya.
  2. Ubah direktori ke folder tempat saya baru saja memindahkan .git ke
  3. Setel ulang konten folder ke apa yang menurut git seharusnya: git reset --hard HEAD
  4. Periksa apakah isinya sesuai dengan yang seharusnya dengan kdiff3 atau alat pembanding lainnya
  5. Hapus file yang sekarang tidak berversi di lokasi lama.

Ini bekerja seperti sihir tanpa berdampak pada sejarah. - NB Jika Anda telah membuat beberapa perubahan, pastikan untuk mengkomitnya sebelum memindahkan direktori .git.

Steve Barnes
sumber
-3

Ada dua cara di sini:

  1. cd TheWrongDirectory rm -rf .git

  2. HAPUS saja folder .git dan cd ke direktori yang benar.

V. Rance
sumber