Sementara perangkat lunak pemrograman disimpan dalam repo Subversion, saya sering memodifikasi beberapa file, kemudian perhatikan bahwa saya ingin melakukan beberapa perubahan persiapan untuk pekerjaan utama saya. Misalnya saat menerapkan fungsi baru, saya melihat beberapa refactoring yang mungkin membantu saya.
Agar tidak mencampur dua perubahan yang tidak terkait, dalam kasus ini saya ingin "menyembunyikan" perubahan saya, yaitu kembali ke versi repositori, lakukan beberapa perubahan lain, lakukan ini, lalu "ambil kembali" perubahan saya.
git-simpanan memungkinkan untuk melakukan hal itu. Apakah ada cara untuk melakukan ini dengan Subversion, baik secara langsung atau dengan beberapa plugin atau skrip. Plugin Eclipse juga akan baik-baik saja.
sumber
Jawaban:
Ketika saya mendapat perubahan yang tidak dikomit dari satu tugas di copy pekerjaan saya dan saya perlu beralih ke tugas lain, saya melakukan salah satu dari dua hal:
Lihat copy pekerjaan baru untuk tugas kedua.
atau
Mulai cabang:
Saya memiliki beberapa skrip yang membantu mengotomatisasi ini.
sumber
project\temp\<creationdate-reason>
atauproject\personal\<creationdate-reason>
untuk tujuan ini.Posting blog ini disarankan menggunakan diff dan patch.
git stash
kira-kira menjadisvn diff > patch_name.patch; svn revert -R .
git stash apply
menjadipatch -p0 < patch_name.patch
Perhatikan bahwa ini tidak menyembunyikan perubahan metadata atau (saya pikir) direktori membuat / menghapus. (Ya, svn melacaknya secara terpisah dari konten direktori, tidak seperti git.)
sumber
svn patch patch_name.patch
bukanpatch -p0
, karena mereka ada di file tambalan, dan svn patch memahaminya.Anda dapat menyimpan perubahan Anda saat ini dengan
svn diff
menjadi file tambalan, lalu mengembalikan copy pekerjaan Anda:Setelah menerapkan fitur persiapan, Anda dapat menerapkan tambalan dengan utilitas tambalan:
Seperti yang telah dicatat orang lain, ini tidak akan bekerja dengan
svn:properties
dan operasi pohon (menambah, menghapus, mengganti nama file dan direktori).File biner juga bisa memberikan masalah, saya tidak tahu bagaimana menambal (atau TortoiseSVN dalam hal ini menangani mereka).
sumber
$ patch --strip=0 < stash.patch
Ini akan memastikan bahwa tambalan tidak menanyakan nama file saat Anda menerapkan tambalan Anda.Cara termudah adalah dengan menggunakan cabang sementara, seperti ini:
Ini bisa (dan mungkin harus) dimasukkan ke dalam naskah jika dilakukan secara lebih teratur.
sumber
Pada 1.10.0 (2018-04-13), Anda memiliki
svn shelve
perintah eksperimental . ( TortoiseSVN mendukung perintah ) Ini bukan apa-apa selain penolong untuk menyimpan tambalan dan menerapkan kembali, sehingga ia memiliki batasan yang sama dengansvn diff
+patch
(yaitu tidak dapat menangani file biner dan mengganti nama). ( Edit : Sepertinya dukungan biner akan hadir di versi 1.11.0 berikutnya )Sunting ^ 2: Dengan 1.11.0 (dirilis 2018-10-30), file biner didukung . Menyimpan file yang diganti nama tetap tidak didukung. Rak di 1,11 tidak kompatibel dengan rak yang dibuat oleh 1,10.
Sunting ^ 3: Dengan 1.12.0 (dirilis 2019-04-24), Menyalin dan mengganti nama didukung . Rak di 1,12 tidak kompatibel dengan rak yang dibuat oleh versi sebelumnya.
Sunting ^ 4: Tidak ada perubahan di sekitar rak dengan 1.13.0 dan 1.14.0 . Perintah masih ditandai sebagai percobaan dan Anda perlu mendefinisikan
SVN_EXPERIMENTAL_COMMANDS=shelf3
untuk mengaktifkan fitur. Sepertinya fitur saat ini tidak tersentuh .Catatan desain dapat ditemukan di Wiki pengembang .
sumber
Saya tidak tahu cara mudah untuk melakukannya hanya dengan svn. Jujur, saya sarankan menggunakan
git-svn
git repo yang berfungsi sebagai copy pekerjaan svn, dan hanya menggunakannyagit stash
. Cukup gantigit pull
dengangit svn rebase
dangit push
dengangit svn dcommit
dan Anda benar-benar dapat menyimpan 90% dari alur kerja git Anda dan masih berbicara dengan server svn.sumber
Ada skrip Python 2 kecil yang disebut
svn-stash
tersedia di bawah GPL 3: https://github.com/frankcortes/svn-stash .Ini berfungsi seperti
svn diff/patch
solusi yang disebutkan dan menawarkan mendorong dan muncul perubahan sebagai berbeda ke beberapa direktori lokal. Sayangnya, simpanan tidak dapat dinamai, dan hanya yang terakhir yang dapat muncul (well, yeah, itu tumpukan, tetapi tidak ada alasan nyata untuk batasan seperti itu.) Namun, Anda selalu dapat membuat fitur yang hilang ke dalam sumber.Ini ditulis untuk * ix, tetapi setelah mengganti setiap "/" dengan
os.sep
itu berfungsi dengan baik di Windows juga.Jika Anda menggunakan svn 1.7 atau lebih tinggi, Anda perlu mengubah
is_a_current_stash()
: menghapus barisif ".svn" in os.listdir(CURRENT_DIR):
, karena hanya ada satu subdir .svn tingkat atas di 1,7 WC's.sumber
Anda dapat melakukannya dengan mudah menggunakan Intellij IDEA - Shelve Changes
sumber
metadata changes
dandirectory creates/deletes
? Seperti apa tepatnyagit stash
?opsi lain adalah menyalin checkout Anda saat ini ke direktori baru dan mengembalikan semua perubahan Anda. dengan cara ini Anda akan menghemat kerumitan membuat cabang sementara di server Anda — setelah semua simpanan adalah operasi lokal, yang tidak semua orang harus melihat dan dapat dilakukan cukup sering.
setelah melakukan perbaikan terbaru Anda, Anda dapat memperbarui copy pekerjaan utama Anda dan menghapus "area penyimpanan" Anda
sumber
Saya juga menginginkan fitur ini. Saat ini saya menggunakan TortoiseSVN.
Saya belum menemukan solusi sulit kecuali untuk mengekspor pohon, kembali ke repositori, lakukan perubahan dan komit saya, lalu bandingkan perubahan dari pohon yang diekspor kembali ke direktori yang dikontrol sumber saya menggunakan alat seperti Beyond Compare.
Atau, solusi lain mungkin untuk bercabang dari HEAD ke direktori lain, buat perubahan dan komit. Setelah Anda siap untuk menggabungkan yang kembali ke copy pekerjaan Anda yang lain, lakukan pembaruan dan gabungkan perubahan Anda.
sumber
Saya selalu menyimpan checkout kedua, yang saya sebut "trunk_clean". Setiap kali saya perlu melakukan perubahan yang cepat dan terisolasi terkait dengan apa yang saya lakukan, saya hanya melakukan checkout itu.
sumber
Ide-ide percabangan dan menambal di atas sangat bagus, tetapi itu tidak bekerja dengan baik untuk saya. Saya menggunakan alat visual diff, jadi menjalankan
git diff
tidak menghasilkan tambalan berbasis teks. Sistem build kami memutar lingkungan baru setiap kali cabang dibuat, sehingga membuat cabang "simpanan" sementara akan berantakan.Sebagai gantinya, saya menulis skrip shell kecil yang menyalin file ke direktori "rak", menambahkan stempel waktu, dan mengembalikan perubahan. Ini tidak sekuat solusi di atas, tetapi juga menghindari beberapa jebakan yang saya temui.
sumber
Berdasarkan jawaban Walter, saya telah membuat alias berikut di file bashrc saya:
Alias ini jauh lebih mudah digunakan dan diingat.
Pemakaian:
svn.stash untuk menyembunyikan perubahan dan svn.stash.apply untuk menerapkan simpanan.
sumber
Dalam praktik saya, saya menggunakan
git init
untuk membuat repositori Git ditrunk
direktori repositori Subversion saya, dan kemudian saya menambahkan*.git
ke pola Abaikan mengabaikan.Setelah memodifikasi beberapa file, jika saya ingin melanjutkan pekerjaan saya dengan arus utama Subversion, saya hanya menggunakan
git stash
untuk menyimpan pekerjaan saya. Setelah melakukan repositori Subversion, saya gunakangit stash pop
untuk mengembalikan modifikasi saya.sumber
Menggunakan:
Ini akan membuat cabang dari lokasi saat ini dan revisi saat ini, dan kemudian akan melakukan perubahan dalam copy pekerjaan ke cabang itu tanpa beralih ke sana.
Perhatikan bahwa perubahan dalam copy pekerjaan tidak akan secara otomatis dikembalikan (
cp
hanya CoPying perubahan ke cabang baru) dan Anda harus mengembalikannya secara manual.Untuk mengembalikan perubahan, Anda bisa menggabungkan perubahan dari cabang yang baru dibuat ke copy pekerjaan Anda.
--ignore-ancestry
digunakan agar tidak memperbarui info gabungan dalam copy pekerjaan.Menggunakan:
untuk melihat apa yang Anda miliki di jalur simpanan. Revisi yang dilakukan juga dicetak.
Jika Anda tidak membutuhkan simpanan lagi, jalankan saja:
Solusi ini lebih baik daripada menggunakan tambalan di bahwa jika perubahan baru dalam copy pekerjaan atau pada konflik cabang saat ini dengan perubahan dalam simpanan, Anda dapat menyelesaikan konflik menggunakan cara svn, sedangkan
patch
dalam beberapa kasus hanya akan gagal atau bahkan menerapkan tambalan yang salah.sumber
Karena Subversion tidak mendukung
stash
fitur dengan sempurna,saya hanya melakukan cara manual seperti ini.
Tempatkan
Development
danProduction(release)
proyeksikan ke jalur yang terpisah.Anda dapat mengerjakan semua fitur baru untuk proyek Anda di jalur pengembangan,
dan Anda hanya akan melakukan kemajuan yang berarti atau sesuatu harus dirilis untuk stabil.
Ketika Anda harus merilisnya untuk produksi, buka proyek produksi, perbarui svn dan lakukan hal-hal untuk dirilis (membangun, mengekspor ... dll).
Saya tahu ini membuat sedikit merepotkan, tetapi melepaskan kemajuan tidak sering terjadi (itu tidak bagi saya, tetapi saya tahu beberapa proyek melakukannya) dibandingkan dengan mengembangkan kemajuan, cara ini cocok untuk saya.
Saya menggunakan svn untuk proyek tertentu karena anggota tim proyek menggunakannya, jadi saya harus mengikuti.
Solusi terbaik adalah menggunakan
git
yang memiliki sistem kontrol versi sempurna dan lebih baik daripadasvn
.sumber
dev
danprod
, 2 situasi. Untuk mengembangkan fungsionalitas yang sama sekali baru akan rumit dengan svn. Saya tidak yakin apakah ada metode yang jelas untuk menyelesaikan kasus Anda di dunia svn.