Saya memiliki salinan proyek yang berfungsi, tanpa data meta kontrol sumber. Sekarang, saya ingin melakukan yang setara dengan git-clone ke folder ini, dan menyimpan perubahan lokal saya.
git-clone tidak memungkinkan saya untuk mengkloning ke folder yang ada. Apa praktik terbaik di sini?
Jawaban:
Ini dapat dilakukan dengan mengkloning ke direktori baru, lalu memindahkan
.git
direktori ke direktori yang ada.Jika direktori Anda yang ada bernama "kode".
Ini juga dapat dilakukan tanpa melakukan checkout selama perintah clone; informasi lebih lanjut dapat ditemukan di sini .
sumber
git clone
perintah pertama, tidak ada perintah checkout lebih lanjut diperlukan. Jika Anda menggunakan sesuatu sepertigit clone --no-checkout
pada langkah pertama itu, maka setelah direktori .git dipindahkan, Anda perlu menggunakannyagit reset HEAD
untuk memberi tahu git bahwa file-file tersebut belum dihapus.git status
.Jangan mengkloning, ambil saja. Dalam repo:
Kemudian Anda dapat mengatur ulang pohon untuk mendapatkan komit yang Anda inginkan:
dan Anda seperti Anda dikloning.
Pertanyaan menarik di sini (dan yang tanpa jawaban): Bagaimana mengetahui komit pohon telanjang Anda berdasarkan, maka ke posisi mana untuk mengatur ulang.
sumber
Berikut ini saya lakukan, untuk checkout cabang utama di direktori yang ada:
sumber
-t
bendera digunakan di sini?Saya akan
git clone
ke direktori baru dan menyalin konten direktori yang ada ke klon baru.sumber
git clone wherever tmp && git mv tmp/.git . && rm -rf tmp
Dengan kata lain, memindahkan.git
dir keluar dari klon sementara tampaknya lebih sederhana daripada membersihkan pohon kerja klon dan menyalin file yang ada di sana.git mv tmp/.git .
kembalifatal: cannot move directory over file, source=tmp/.git, destination=.git
untuk saya. Adakah yang tahu apa masalahnya?mv
, tidakgit mv
; meskipun ini tidak menjelaskan mengapa Anda memiliki.git
file yang sudah ada (berisigitdir: some/path/to/a/git-dir
, "gitfile"; jika tidak ada di sana, maka Anda akan melihatnyafatal: Not a git repository (or any of the parent directories): .git
sebagai gantinya).Menggunakan direktori temp baik-baik saja, tetapi ini akan berhasil jika Anda ingin menghindari langkah itu. Dari akar direktori kerja Anda:
sumber
git reset --hard origin/master
akan menghapus file lokal apa pun.hard
danmixed
adalah bahwa campuran akan menyimpan perubahan lokal (jadi jika Anda kemudian mencoba menariknya akan menunjukkan kepada Anda mis. Tidak dapat menarik dengan rebase: Anda memiliki perubahan yang belum dipentaskan. Silakan komit atau sembunyikan ) , sementara hard akan membuang perubahan lokal itusumber
git reset --hard
akan membatalkan perubahan file lokal, khususnya BUKAN apa yang diminta OP ini.--mixed
harus digunakan sebagai gantinya.Untuk mengkloning git repo ke direktori kosong yang ada lakukan hal berikut:
Perhatikan bagian
.
akhirgit clone
perintah Anda . Itu akan mengunduh repo ke direktori kerja saat ini.sumber
fatal: destination path '.' already exists and is not an empty directory.
Sudah banyak jawaban untuk melakukannya seperti yang diminta OP. Tetapi perlu dicatat bahwa melakukannya sebaliknya jauh lebih mudah:
Anda sekarang memiliki status target yang diinginkan - klon baru + perubahan-lokal.
sumber
Ada dua pendekatan untuk ini. Jika memungkinkan saya akan mulai dengan folder bersih untuk direktori kerja git baru Anda dan kemudian menyalin versi Anda nanti. Ini mungkin terlihat seperti *:
Pada titik ini Anda harus memiliki copy pekerjaan yang cukup bersih dengan folder kerja Anda sebelumnya sebagai direktori kerja saat ini sehingga setiap perubahan termasuk penghapusan file akan muncul di radar jika Anda menjalankan
git status
.Di sisi lain jika Anda benar-benar harus melakukannya sebaliknya, Anda bisa mendapatkan hasil yang sama dengan sesuatu seperti ini:
Apa pun itu, hal pertama yang akan saya lakukan adalah menjalankan sesuatu seperti
git stash
mendapatkan salinan dari semua perubahan lokal Anda yang disisihkan, kemudian Anda dapat mendaftar ulang dan bekerja melalui mana yang ingin Anda komit.* Kedua contoh menganggap Anda mulai pada shell di direktori induk proyek Anda.
sumber
Ini adalah yang terbaik dari semua metode yang saya temui
Klon hanya folder .git repositori (tidak termasuk file yang sudah ada
existing-dir
) ke direktori sementara yang kosonggit clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp
// mungkin ingin --no-hardlinks untuk mengkloning repo lokalPindahkan folder .git ke direktori dengan file. Ini membuat
existing-dir
repo git.mv existing-dir/existing-dir.tmp/.git existing-dir/
Hapus direktori sementara
rmdir existing-dir/existing-dir.tmp
cd existing-dir
Git berpikir semua file dihapus, ini mengembalikan status repo ke HEAD.
PERINGATAN: perubahan lokal pada file akan hilang.
git reset --mixed HEAD
sumber
Jika Anda menggunakan setidaknya git 1.7.7 (yang diajarkan
clone
dalam--config
pilihan), untuk mengubah direktori saat ini menjadi copy pekerjaan:Ini bekerja dengan:
.git
folder baru--mirror
membuat klon baru menjadi folder metadata murni seperti yang.git
seharusnya--config core.bare=false
countermands implisitbare=true
dari--mirror
pilihan, sehingga memungkinkan repositori untuk memiliki direktori kerja terkait dan bertindak seperti clone yang normalIni jelas tidak akan berfungsi jika
.git
direktori metadata sudah ada di direktori yang ingin Anda ubah menjadi salinan yang berfungsi.sumber
[core]
bagian dari konfigurasi lokal termasuk keduanyabare = true
danbare = false
. Lebih bermasalah adalah bahwa ia akan memiliki nilai yang salah untukorigin
remote, dengan[remote "origin"]
bagian termasukmirror = true
dan mengambil spec yang tidak akan berfungsi dengan baik dengan copy yang berfungsi. Setelah memperbaiki masalah ini, kloning secara normal dan memindahkan copy pekerjaan baru.git
akan lebih efisien.Biasanya saya akan mengkloning repositori awal terlebih dahulu, dan kemudian memindahkan semua yang ada di folder yang ada ke repositori awal. Ini bekerja setiap saat.
Keuntungan dari metode ini adalah Anda tidak akan melewatkan repositori awal termasuk README atau .gitignore.
Anda juga dapat menggunakan perintah di bawah ini untuk menyelesaikan langkah-langkah:
sumber
Anda bisa melakukannya dengan mengetikkan baris perintah berikut secara rekursif:
sumber
Cukup gunakan. di akhir
git clone
perintah (berada di direktori itu), seperti ini:sumber