Saya perlu menggabungkan dua repositori Git ke dalam repositori ketiga yang baru. Saya telah menemukan banyak deskripsi tentang bagaimana melakukan ini menggunakan penggabungan subtree (misalnya jawaban Jakub Narębski pada Bagaimana Anda menggabungkan dua repositori Git? ) Dan mengikuti instruksi tersebut sebagian besar berfungsi, kecuali ketika saya melakukan subtree menggabungkan semua file dari repositori lama dicatat sebagai file baru yang ditambahkan. Saya bisa melihat komit sejarah dari repositori lama ketika saya melakukannya git log
, tetapi jika saya melakukannya git log <file>
hanya menunjukkan satu komit untuk file itu - penggabungan subtree. Dilihat dari komentar pada jawaban di atas, saya tidak sendirian dalam melihat masalah ini tetapi saya tidak menemukan solusi yang dipublikasikan untuk itu.
Apakah ada cara menggabungkan repositori dan membiarkan riwayat file individu utuh?
sumber
Jawaban:
Ternyata jawabannya jauh lebih sederhana jika Anda hanya mencoba merekatkan dua repositori bersama dan membuatnya tampak seperti itu selama ini daripada mengelola ketergantungan eksternal. Anda hanya perlu menambahkan remote ke repo lama Anda, menggabungkannya ke master baru Anda, memindahkan file dan folder ke subdirektori, melakukan perpindahan, dan ulangi untuk semua repo tambahan. Submodules, subtree merge, dan rebase mewah dimaksudkan untuk menyelesaikan masalah yang sedikit berbeda dan tidak cocok untuk apa yang saya coba lakukan.
Berikut ini contoh skrip Powershell untuk merekatkan dua repositori bersama:
Jelas Anda malah bisa menggabungkan old_b ke old_a (yang menjadi repo gabungan baru) jika Anda lebih suka melakukannya - modifikasi skrip yang sesuai.
Jika Anda juga ingin membawa cabang fitur yang sedang dalam proses, gunakan ini:
Itu adalah satu-satunya bagian yang tidak jelas dari proses - itu bukan penggabungan subtree, melainkan argumen untuk penggabungan rekursif normal yang memberi tahu Git bahwa kami mengganti nama target dan yang membantu Git mengatur semuanya dengan benar.
Saya menulis penjelasan yang sedikit lebih rinci di sini .
sumber
git mv
ini tidak bekerja dengan baik. ketika nanti Anda menggunakangit log
pada salah satu file yang dipindahkan, Anda hanya mendapatkan komit dari langkah tersebut. semua riwayat sebelumnya hilang. ini karenagit mv
benar-benargit rm; git add
tetapi dalam satu langkah .git log --follow
, atau semua alat GUI melakukannya untuk Anda secara otomatis. Dengan penggabungan subtree, Anda tidak bisa mendapatkan riwayat untuk file individual, sejauh yang saya tahu, jadi metode ini lebih baik.1
(nomor satu) untukls
dan modal 'mata' untukxargs
. Terima kasih atas tip ini!Inilah cara yang tidak menulis ulang riwayat apa pun, sehingga semua ID komit akan tetap valid. Hasil akhirnya adalah bahwa file repo kedua akan berakhir di subdirektori.
Tambahkan repo kedua sebagai remote:
Pastikan Anda telah mengunduh semua komitmen dari secondrepo:
Buat cabang lokal dari cabang repo kedua:
Pindahkan semua file-nya ke subdirektori:
Gabungkan cabang kedua ke cabang utama repo pertama:
Repositori Anda akan memiliki lebih dari satu root commit, tetapi itu seharusnya tidak menimbulkan masalah.
sumber
git remote show secondrepo
)--allow-unrelated-histories
. Lihat riwayat posting jawaban ini.Beberapa tahun telah berlalu dan ada solusi up-vote berbasis baik tetapi saya ingin berbagi milik saya karena itu sedikit berbeda karena saya ingin menggabungkan 2 repositori jarak jauh menjadi yang baru tanpa menghapus sejarah dari repositori sebelumnya.
Buat repositori baru di Github.
Unduh repo yang baru dibuat dan tambahkan repositori jarak jauh yang lama.
Ambil semua file dari repo lama sehingga cabang baru dibuat.
Di cabang master, lakukan penggabungan untuk menggabungkan repo lama dengan yang baru dibuat.
Buat folder baru untuk menyimpan semua konten baru yang dibuat yang ditambahkan dari OldRepo dan pindahkan file-nya ke folder baru ini.
Terakhir, Anda dapat mengunggah file dari repo gabungan dan menghapus OldRepo dengan aman dari GitHub.
Semoga ini bisa bermanfaat bagi siapa pun yang berurusan dengan penggabungan repositori jarak jauh.
sumber
git remote rm OldRepo
.silakan lihat menggunakan
untuk menghubungkan dua sejarah sejak dini dalam kehidupan mereka.
Jika Anda memiliki jalur yang tumpang tindih, perbaiki dengan
ketika Anda menggunakan log, pastikan Anda "menemukan salinan lebih sulit" dengan
dengan cara itu Anda akan menemukan pergerakan file di jalur.
sumber
Saya mengubah solusi dari @Flimm ini menjadi
git alias
seperti ini (ditambahkan ke saya~/.gitconfig
):sumber
$GIT_PREFIX
?Fungsi ini akan mengkloning repo jarak jauh ke dir repo lokal:
Cara Penggunaan:
Memperhatikan. Script ini dapat menulis ulang komit tetapi akan menyimpan semua penulis dan tanggal, itu berarti komit baru akan memiliki hash lain, dan jika Anda mencoba untuk mendorong perubahan ke server jarak jauh, ia dapat hanya dengan tombol paksa, juga akan menulis ulang komit di server. Jadi harap buat cadangan sebelum diluncurkan.
Keuntungan!
sumber
git filter-branch --index-filter
bekerja. Biasanya saya mendapatkan pesan kesalahan bahwa file indeks baru tidak ada. Apakah itu berdering?git-add-repo.sh
dengan fungsi di atas, pada akhir file tuliskan baris inigit-add-repo "$@"
. Setelah itu Anda dapat menggunakannya dari zsh likecd current/git/package
danbash path/to/git-add-repo.sh https://github.com/example/example dir/to/save
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
terkadang gagal, jadi Anda harus menambahkanif test
.Ikuti langkah-langkah untuk menanamkan satu repo ke repo lain, memiliki satu sejarah git tunggal dengan menggabungkan kedua sejarah git.
my/new/subdir
(3 kejadian) dengan struktur direktori tempat Anda ingin repo anak.Jika Anda memeriksa git log di repo induk sekarang, seharusnya repo child digabung. Anda juga dapat melihat tanda yang menunjukkan dari sumber komit.
Artikel di bawah ini membantu saya dalam Menanamkan satu repo ke repo lain, memiliki satu sejarah git tunggal dengan menggabungkan kedua sejarah git.
http://ericlathrop.com/2014/01/combining-git-repositor//
Semoga ini membantu. Selamat Coding!
sumber
git filter-branch --prune-empty --tree-filter ' if [ ! -e my/new/subdir ]; then mkdir -p my/new/subdir; git ls-tree --name-only $GIT_COMMIT | xargs -I files mv files my/new/subdir; fi'
Katakanlah Anda ingin menggabungkan repositori
a
keb
(Saya berasumsi mereka berada di satu sama lain):Jika Anda ingin menempatkan
a
subdirektori lakukan hal berikut sebelum perintah di atas:Untuk ini, Anda perlu
git-filter-repo
menginstal (filter-branch
tidak disarankan ).Contoh menggabungkan 2 repositori besar, menempatkan salah satunya ke dalam subdirektori: https://gist.github.com/x-yuri/9890ab1079cf4357d6f269d073fd9731
Lebih lanjut di sini .
sumber