Setelah berhasil mengubah repositori SVN ke Git, sekarang saya memiliki repositori Git yang sangat besar yang ingin saya bagi menjadi beberapa repositori yang lebih kecil dan mempertahankan riwayat.
Jadi, dapatkah seseorang membantu memecahkan repo yang mungkin terlihat seperti ini:
MyHugeRepo/
.git/
DIR_A/
DIR_B/
DIR_1/
DIR_2/
Ke dalam dua repositori yang terlihat seperti ini:
MyABRepo/
.git
DIR_A/
DIR_B/
My12Repo/
.git
DIR_1/
DIR_2/
Saya telah mencoba mengikuti petunjuk dalam pertanyaan sebelumnya ini tetapi tidak benar-benar cocok ketika mencoba menempatkan beberapa direktori ke dalam repo terpisah ( Subdirektori Lepaskan (pindah) ke dalam repositori Git terpisah ).
Jawaban:
Ini akan mengatur MyABRepo; Anda juga dapat melakukan My12Repo dengan cara yang sama.
Referensi ke .git / refs / original / refs / heads / master tetap ada. Anda dapat menghapusnya dengan:
Jika semuanya berjalan dengan baik, Anda dapat menghapus MyABRepo.tmp.
Jika karena alasan tertentu Anda mendapatkan error terkait .git-rewrite, Anda dapat mencoba ini:
Ini akan membuat dan menggunakan /tmp/git-rewrite.tmp sebagai direktori sementara, bukan
.git-rewrite
. Biasanya, Anda dapat mengganti jalur apa pun yang Anda inginkan/tmp/git-rewrite.tmp
, selama Anda memiliki izin menulis, dan direktori tersebut belum ada.sumber
DIR_A
, misalnya)?filter-branch
. Bagi mereka yang tidak sadar, itu menulis ulang sejarah, jadi jika Anda berencana untuk mendorong repo setelah Anda melakukan ini, hash komit akan berbeda sekarang dan itu tidak akan berfungsi.Anda dapat menggunakan
git filter-branch --index-filter
withgit rm --cached
untuk menghapus direktori yang tidak diinginkan dari klon / salinan repositori asli Anda.Sebagai contoh:
Anda perlu menghapus secara manual setiap cabang atau tag repositori yang tidak dibutuhkan (misalnya jika Anda memiliki cabang feature-x-for-AB , maka Anda mungkin ingin menghapusnya dari repositori “12”).
sumber
:
bukan karakter komentar di bash. Anda harus menggunakan#
sebagai gantinya.:
adalah perintah bawaan tradisional ( juga ditentukan dalam POSIX ). Ini termasuk dalam bash , tapi ini bukan komentar. Saya secara khusus menggunakannya sebagai preferensi#
karena tidak semua shell mengambil#
sebagai pengantar komentar dalam semua konteks (misalnya zsh interaktif tanpa opsi INTERACTIVE_COMMENTS diaktifkan). Menggunakan:
membuat seluruh teks cocok untuk ditempelkan ke shell interaktif apa pun serta disimpan dalam file skrip.git remote rm origin
, yang sepertinya selalu kembali 1. Oleh karena itu saya mengganti&&
dengan;
untuk baris ini.git remote add origin $TARGET; git push origin master
.Proyek git_split adalah skrip sederhana yang melakukan persis seperti yang Anda cari. https://github.com/vangorra/git_split
Ubah direktori git menjadi repositori mereka sendiri di lokasinya sendiri. Tidak ada bisnis lucu subtree. Skrip ini akan mengambil direktori yang ada di repositori git Anda dan mengubah direktori itu menjadi repositori independennya sendiri. Sepanjang jalan, itu akan menyalin seluruh riwayat perubahan untuk direktori yang Anda berikan.
sumber
Berikut adalah skrip ruby yang akan melakukannya. https://gist.github.com/4341033
sumber
Terima kasih atas jawaban Anda tetapi saya akhirnya hanya menyalin repositori dua kali kemudian menghapus file yang tidak saya inginkan dari masing-masing file. Saya akan menggunakan cabang filter di kemudian hari untuk menghapus semua komit untuk file yang dihapus karena versi tersebut sudah dikontrol di tempat lain.
Ini berhasil untuk apa yang saya butuhkan.
EDIT: Tentu saja, hal yang sama dilakukan di My12Repo terhadap direktori A dan B. Ini memberi saya dua repo dengan sejarah yang identik sampai saya menghapus direktori yang tidak diinginkan.
sumber