Datang dengan strategi kontrol versi untuk SVN

9

Saya akan mencoba dan membuat strategi untuk kontrol versi untuk perusahaan saya; kami saat ini menggunakan SVN tetapi tidak ada struktur untuk itu - kami pada dasarnya hanya memiliki trunk dan hanya berkomitmen untuk itu. Baru-baru ini manajer pengembangan memulai repositori kedua yang bertindak sebagai "tag" kami, tetapi harus digabung secara manual dengan "trunk" karena itu bukan bagian dari repositori yang sama tetapi yang benar-benar terpisah. Akibatnya hanya ada satu folder, yang disebut "Dev" (sebenarnya ada folder "Dev" yang berbeda pada tanggal yang berbeda tetapi hanya "Dev" adalah yang utama) dan di bawah itu adalah segalanya; semua proyek lainnya. Ini tidak diatur oleh proyek sama sekali, tidak memiliki konsep cabang / tag / trunk atau apa pun. Orang yang mengaturnya awalnya (sudah lama, tentu saja) sepertinya tidak tahu cara mengatur SVN sama sekali, dan sejak itu tidak ada yang repot-repot belajar bagaimana melakukan sesuatu dengan benar karena takut merusak sesuatu. Kami tidak menggunakan CI apa pun (atau pengujian otomatis, sayangnya).

Pertama, haruskah kita memisahkannya dengan proyek? Misalnya, kami memiliki: Dua situs web ASP.NET (bukan Aplikasi Web, Situs Web), Layanan Web, folder penempatan untuk semua skrip tabel dan prosedur tersimpan, dua klien baris perintah untuk proyek eksternal yang dipanggil oleh WebSites dan folder bersama yang memiliki objek bisnis umum dan sejenisnya. Haruskah masing-masing menjadi proyek mereka sendiri dengan pengaturan cabang / tag / trunk, atau harus seperti ini:

dev/
  branches/
  tags/
  trunk/
      Site1/
      Site2/
      WebService/
      SharedCode/

dan memiliki semua cabang dan semuanya memiliki salinan seluruh folder Dev? Pendekatan itu mungkin lebih mudah untuk ditelan karena kita sering mengalami situasi di mana kita perlu membuat perubahan dalam perpustakaan kode bersama dan setidaknya satu (biasanya keduanya) dari situs web juga.

Kedua, kami melakukan rilis reguler ("push" dalam bahasa kami) ke server dev dan server langsung kami. Dari apa yang saya baca cara terbaik untuk menangani ini adalah bahwa semua pengembangan masuk ke trunk /, cabang adalah "sementara" dan digunakan untuk menambahkan fitur baru yang mungkin mempengaruhi trunk, dan tag adalah untuk rilis? Jadi, kami mendorong setiap bulan katakanlah, dan saya sedang mengerjakan modul baru. Saya akan bercabang batang, dan menggunakan cabang itu untuk kode saya, menulis dan mengujinya dan apa pun. Ketika modul selesai, saya akan menggabungkannya kembali ke trunk (dan mungkin menghapus cabang), dan ketika kami siap untuk digunakan, kami akan menandainya ("May2011" katakan saja). Jika kami memiliki perbaikan bug setelah ditayangkan, itu akan diperbaiki di tag May2011 dan digabung menjadi trunk (jadi trunk juga memperbaikinya), dan kemudian May2011 akan didorong keluar lagi dengan perbaikannya? Apakah ini maksud pemberian tag?

Wayne Molina
sumber
5
Strategi di luar kotak: beralih ke git.
Rein Henrichs
Jika itu pilihan, saya akan melakukannya (atau Mercurial, karena kami adalah toko Windows). Saya pikir saya akan menghadapi lebih banyak perlawanan mencoba untuk pindah ke sistem kontrol sumber yang sama sekali baru daripada mencoba setidaknya mendapatkan lingkungan yang tepat dengan SVN.
Wayne Molina
2
Meskipun saya senang dengan DVCS, Subversion adalah alat yang bagus. CVS atau solusi lain tanpa versi folder akan lebih buruk.
Matthew Rodatus
2
@Wayne M - Anda mungkin menemukan itu sebenarnya sebaliknya. Mungkin lebih mudah untuk membuat orang mendaftar ke struktur lingkungan yang lebih masuk akal jika hal itu memberi mereka semua keuntungan menggunakan DVCS. Sebagai transisi, Anda mungkin ingin mempertimbangkan untuk mencoba akses percabangan / repo lokal murah menggunakan gitsvn atau hgsubversion. Begitu mereka terhubung dan terbiasa dengan alat-alat, mungkin ada keinginan kelompok besar untuk pindah ke DVCS untuk repo utama.
Mark Booth

Jawaban:

5

Jika Anda menginginkan proses build yang disatukan, maka pastikan untuk meletakkan cabang / tag / trunk di root, seperti ini:

branches/
tags/
trunk/
  dev/
    ...

Jika Anda tidak memerlukan proses pembangunan yang terpadu, maka Anda dapat menempatkan cabang / tag / batang dalam setiap proyek jika Anda mau. Namun, mungkin sulit untuk bermigrasi ke gedung yang disatukan setelah memasukkannya ke dalam setiap proyek. Bangunan terpadu memiliki kelebihan, seperti menghilangkan kebutuhan untuk menerbitkan komponen bersama di antara proyek - mereka semua adalah bagian dari bangunan.

Secara pribadi, saya suka proses pembangunan terpadu. Selain itu, saya tidak berpikir Anda harus memiliki proyek "dev". Anda seharusnya memiliki proyek langsung di bawah trunk, dan kemudian cabut trunk ke cabang dev. Gunakan tag untuk rilis. Sebagai contoh, saya akan melakukannya seperti ini:

branches/
  dev/
    Site1/
    Site2/
    WebService/
    SharedCode/
tags/
  release1/
    Site1/
    Site2/
    WebService/
    SharedCode/
trunk/
  Site1/
  Site2/
  WebService/
  SharedCode/
Matthew Rodatus
sumber
1
Bangunan terpadu memiliki kelebihan, seperti menghilangkan kebutuhan untuk menerbitkan komponen bersama di antara proyek - mereka semua adalah bagian dari bangunan.
Matius Rodatus
2
Jika Anda memerlukan beberapa build bersatu, buat direktori di bawah trunk untuk masing-masing. Tapi, saya tidak akan menyebut satu "dev" - itu lebih baik dilakukan dengan cabang. Misalnya, Anda mungkin memiliki dua organisasi pengembang utama - satu yang bekerja pada driver perangkat dan satu yang bekerja di situs web perusahaan. Anda mungkin ingin dua bangunan terpadu yang terpisah.
Matius Rodatus
1
  1. Sejauh struktur kode dalam svn berjalan ini benar-benar pilihan pribadi.

Saya akan menyarankan bahwa jika proyek terkait atau berbagi kode maka mereka menginginkan trunk yang umum. Jika mereka independen maka mereka ingin batang yang terpisah atau bahkan repositori yang terpisah. Jika Anda perlu memberikan salinan riwayat svn kepada pihak ketiga untuk suatu proyek, maka akan jauh lebih mudah jika berada dalam repositori terpisah.

Jadi dalam kasus Anda kedengarannya seperti tata letak yang Anda buat sketsa di atas akan masuk akal, karena Anda telah berbagi kode dan Anda ingin cabang / tag untuk memasukkan kode bersama itu.

  1. Deskripsi tag dan branch Anda terdengar sangat masuk akal dan saya berharap svn akan digunakan. Itu memang maksud dari penandaan seperti yang saya mengerti. BTW dalam svn tag dan cabang sebenarnya adalah hal yang sama, tetapi terminologi ini diterapkan karena Anda telah menerapkannya.

Secara pribadi saya juga akan menambahkan peringatan bahwa apa pun yang dilakukan untuk membangun trunk harus, harus atomik dan tidak boleh melanggar tes unit. Cabang adalah untuk pekerjaan yang belum selesai dalam proses. Saya berharap bagasi menjadi kandidat rilis potensial pada titik mana pun.

Luke Graham
sumber
Apakah Anda mengatakan bahwa hanya kode yang diuji dan siap-produksi yang harus ada di bagasi? Saya pikir kode apa pun yang dilakukan harus dibuat dan mungkin lulus tes, dan kode trunk tentu saja harus lulus tes. Tetapi sepertinya tujuan SVN adalah untuk dapat mengikuti sejarah pengembangan, dan itu lebih mudah jika tidak dibagi di beberapa cabang. Mungkin harus ada cabang yang Anda gabungkan batangnya ketika bagasi dalam keadaan siap diuji dan siap-produksi?
Tuan Jefferson
0

Berikut ini adalah cara terbaik untuk meletakkan repositori Subversion

project_a
     - branches
     - tags
     - trunk
project_b
     - branches
     - tags
     - trunk
project_c
     - branches
     - tags
     - trunk
master
     - branches
     - tags
     - trunk       
         - svn:external project_a
         - svn:external project_b
         - svn:external project_c

Dengan cara ini Anda dapat memeriksa masing-masing proyek sendiri.

Jika Anda ingin memeriksa semua 3 proyek dan melakukan pembangunan terpadu dengan beberapa skrip / sistem build monolitik kemudian selidiki menggunakan modul master dengan svn: eksternal memetakan semua proyek lain ke dalam master trunk .

Sekilas ini lebih rumit tetapi ini adalah cara yang paling dapat dipelihara dan idiomatis untuk menyelesaikan masalah ini dengan Subversion.


sumber
2
Saya sangat tidak setuju. Repositori melakukan lebih dari sekadar menyimpan kode; itu mengkomunikasikan struktur organisasi dan hubungan antara komponen; ini adalah saluran komunikasi yang vital, walaupun implisit,. Jika Anda memecah setiap proyek secara terpisah maka Anda memperkenalkan hambatan buatan dan tidak perlu untuk komunikasi.
William Payne