Saya memiliki beberapa cabang lama di repositori git saya yang tidak lagi dalam pengembangan aktif. Saya ingin mengarsipkan cabang sehingga tidak muncul secara default saat berjalan git branch -l -r
. Saya tidak ingin menghapusnya, karena saya ingin menyimpan sejarahnya. Bagaimana saya bisa melakukan ini?
Saya tahu bahwa mungkin untuk membuat referensi di luar referensi / kepala. Sebagai contoh refs/archive/old_branch
,. Adakah konsekuensi dari melakukan itu?
git checkout [rev] file
Attic/<branchname>
tag ringan untuk mengarsipkan cabang.Jawaban:
Saya percaya cara yang tepat untuk melakukan ini adalah dengan menandai cabang. Jika Anda menghapus cabang setelah Anda memberi tag maka Anda telah menyimpan cabang dengan efektif tetapi itu tidak akan mengacaukan daftar cabang Anda.
Jika Anda perlu kembali ke cabang cukup periksa tag. Ini akan secara efektif mengembalikan cabang dari tag.
Untuk mengarsipkan dan menghapus cabang:
Untuk mengembalikan cabang beberapa waktu kemudian:
Sejarah cabang akan dipertahankan sama seperti ketika Anda memberi tag itu.
sumber
git checkout -b <branchname> archive/<branchname>
branch -D
karena itu mungkin tidak sepenuhnya digabung jika Anda mengarsipkannya dengan cara iniJawaban Jeremy pada prinsipnya benar, tetapi IMHO perintah yang dia tentukan tidak sepenuhnya benar.
Berikut cara mengarsipkan cabang ke tag tanpa harus checkout cabang (dan, karenanya, tanpa harus checkout ke cabang lain sebelum Anda dapat menghapus cabang itu):
Dan inilah cara mengembalikan cabang:
sumber
Ya, Anda dapat membuat referensi dengan menggunakan awalan non-standar
git update-ref
. misalnyagit update-ref refs/archive/old-topic topic && git branch -D topic
git branch topic refs/archive/old-topic
Ref dengan awalan non-standar (di sini
refs/archive
) tidak akan muncul pada biasagit branch
,git log
ataugit tag
. Namun, Anda dapat mendaftarkannya dengangit for-each-ref
.Saya menggunakan alias berikut:
Juga, Anda mungkin ingin mengonfigurasi remote seperti
push = +refs/archive/*:refs/archive/*
untuk mendorong cabang yang diarsipkan secara otomatis (ataugit push origin refs/archive/*:refs/archive/*
untuk sekali tembak).Cara lain adalah dengan menuliskan SHA1 di suatu tempat sebelum menghapus cabang, tetapi memiliki keterbatasan. Komit tanpa referensi akan diberikan setelah 3 bulan (atau beberapa minggu tanpa reflog) , apalagi manual
git gc --prune
. Komit yang ditunjukkan oleh referensi aman dari GC.Sunting: Ditemukan implementasi perl dari ide yang sama oleh @ap :
git-attic
Sunting ^ 2: Menemukan posting blog di mana Gitster sendiri menggunakan teknik yang sama.
sumber
Memperluas jawaban Steve untuk mencerminkan perubahan pada remote, saya lakukan
Untuk memulihkan dari jarak jauh, lihat pertanyaan ini .
sumber
Anda bisa mengarsipkan cabang di repositori lain. Tidak begitu elegan, tapi saya akan mengatakan itu adalah alternatif yang layak.
sumber
git-bundle
alih-alih repositori terpisah.Berikut ini adalah alias untuk itu:
Tambahkan seperti ini:
Ingatlah bahwa sudah ada
git archive
perintah sehingga Anda tidak dapat menggunakanarchive
sebagai nama alias.Anda juga dapat menentukan alias untuk melihat daftar cabang 'diarsipkan':
tentang menambahkan alias
sumber
!git tag archive/$1 $1 && git branch -D
Saya menggunakan alias berikut untuk menyembunyikan cabang yang diarsipkan:
Jadi
git br
untuk menunjukkan cabang yang dikembangkan secara aktif dangit bra
untuk menunjukkan semua cabang termasuk yang "diarsipkan" .sumber
Saya tidak akan mengarsipkan cabang. Dengan kata lain, cabang mengarsipkan diri mereka sendiri. Yang Anda inginkan adalah memastikan informasi yang relevan dengan arkeolog dapat ditemukan dengan cara yang dapat diandalkan. Dapat diandalkan karena mereka membantu pengembangan harian dan tidak menambah langkah ekstra untuk proses menyelesaikan pekerjaan. Artinya, saya tidak percaya orang akan ingat untuk menambahkan tag setelah mereka selesai dengan cabang.
Inilah dua langkah sederhana yang akan sangat membantu arkeologi dan pengembangan.
git merge --no-ff
untuk menggabungkan cabang tugas; Anda ingin penggabungan komit dan gelembung riwayat, bahkan hanya untuk satu komit.Itu dia. Mengapa? Karena sebagai seorang arkeolog kode, saya jarang memulai dengan ingin tahu pekerjaan apa yang dilakukan pada cabang. Jauh lebih sering
itu sebabnya dalam semua teriakan sembilan neraka adalah kode yang ditulis dengan cara ini ?!Saya perlu mengubah kode, tetapi memiliki beberapa fitur aneh, dan saya perlu memecahkannya untuk menghindari melanggar sesuatu yang penting.Langkah selanjutnya adalah
git blame
menemukan komit terkait dan kemudian berharap pesan log jelas. Jika saya perlu menggali lebih dalam, saya akan mencari tahu apakah pekerjaan itu dilakukan di cabang dan membaca cabang secara keseluruhan (bersama dengan komentarnya di pelacak masalah).Katakanlah
git blame
poin di komit XYZ. Saya membuka browser riwayat Git (gitk, GitXgit log --decorate --graph
,, dll ...), cari komit XYZ dan lihat ...Ada dahan saya! Saya tahu QQ, UU, XYZ, JJ dan MM semuanya adalah bagian dari cabang yang sama dan saya harus melihat pesan log mereka untuk detailnya. Saya tahu GG akan menjadi gabungan komit dan memiliki nama cabang yang mudah-mudahan dikaitkan dengan masalah di pelacak.
Jika, karena alasan tertentu, saya ingin menemukan cabang lama yang dapat saya jalankan
git log
dan mencari nama cabang di komit gabungan. Itu cukup cepat bahkan pada repositori yang sangat besar.Itulah yang saya maksud ketika saya mengatakan bahwa cabang mengarsipkan diri mereka sendiri.
Memberi tag pada setiap cabang menambahkan pekerjaan yang tidak perlu untuk menyelesaikan sesuatu (proses kritis yang harus dirampingkan tanpa ampun), membuat daftar tag (tidak berbicara tentang kinerja, tetapi keterbacaan manusia) dengan ratusan tag yang hanya sekali-sekali berguna, dan bukankah ' Bahkan sangat berguna untuk arkeologi.
sumber
Pendekatan saya adalah mengubah nama semua cabang yang tidak saya pedulikan dengan awalan "trash_", lalu gunakan:
(dengan ikatan kunci shell)
Untuk mempertahankan pewarnaan cabang aktif, Anda perlu:
sumber
Anda dapat menggunakan skrip yang akan mengarsipkan cabang untuk Anda
archbranch
Itu membuat tag untuk Anda dengan arsip awalan / dan kemudian menghapus cabang. Tetapi periksa kode sebelum Anda menggunakannya.
Penggunaan -
$/your/location/of/script/archbranch [branchname] [defaultbranch]
Jika Anda ingin menjalankan skrip tanpa menulis lokasi, tambahkan skrip ke jalur Anda
Maka Anda dapat memanggilnya dengan
Ini
[defaultbranch]
adalah cabang yang akan dituju ketika pengarsipan selesai. Ada beberapa masalah dengan pengkodean warna tetapi selain itu harus bekerja. Saya sudah menggunakannya dalam proyek-proyek untuk waktu yang lama, tetapi masih dalam pengembangan.sumber
Saya terkadang mengarsipkan cabang sebagai berikut:
format-patch <branchName> <firstHash>^..<lastHash>
(dapatkan firstHash dan lastHash menggunakangit log <branchName>
.git branch -D <branchName>
"Terapkan" tambalan saat Anda perlu menggunakan cabang lagi; Namun, menerapkan file tambalan (lihat
git am
) dapat menjadi tantangan tergantung pada keadaan cabang target. Di sisi positifnya, pendekatan ini memiliki manfaat yang memungkinkan komitmen cabang untuk mengumpulkan sampah dan menghemat ruang di repo Anda.sumber