Bagajdan bir SVN etiketi nasıl oluşturulur?


282

Subversion'daki ilk projemi oluşturuyorum . Şimdiye kadar var

 branches
 tags
 trunk

Sanırım şubeleri tekil yapmam ve baştan başlamam gerekiyor. Güncelleme dalları normdur.

Bagajda iş yapıyorum ve içeriği aşağıdaki gibi etiketlere taşıyorum.

mkdir tags/1.0
cp -rf trunk/* tags/1.0
svn add tags/1.0
svn commit -m " create a first tagged version"

Benim bağırsak bana bunun tamamen yanlış olduğunu söylüyor ve ben kullanarak dosyaları arasında bazı ilişki sürdürmek gerekir svn copy. Bu şekilde oluşturduğum dosyaların birbiriyle hiçbir ilişkisi olmayacak ve Subversion özelliklerini kaçırmayacağımdan eminim. Doğrumuyum?

Tek tek dosyalar için svn kopyasını kullanmalı mıyım?

mkdir tags/1.0
svn add tags/1.0
svn copy trunk/file1 tags/1.0
svn copy trunk/file2 tags/1.0
svn copy trunk/file3 tags/1.0
svn commit -m " create a first tagged version"

Tüm dizinde svn kopyasını kullanmalı mıyım?

svn copy cp -rf trunk tags/1.0
svn commit -m " create a first tagged version"

10
Ne yazık ki bu durumda tüm seçimleri yapmıyorum ... git oldukça kahrolası bir sihir.
ojblass

Yanıtlar:


186

Tags klasörüne dosya eklemenin "doğru" olmadığı konusunda haklısınız.

copyKullanılacak işlemin doğru olduğunu tahmin ettiniz ; Subversion'un bu dosyaların geçmişini takip etmesini ve ayrıca (daha fazla) bunları daha verimli bir şekilde saklamasını sağlar.

Deneyimlerime göre, tüm projelerin kopyalarını ("anlık görüntüler"), yani kök teslim konumundan tüm dosyaları yapmak en iyisidir. Bu şekilde anlık görüntü, belirli bir zamanda tüm projenin durumunun gerçek bir temsili olarak kendi başına durabilir.

"Kitabın" bu kısmı komutun tipik olarak nasıl kullanıldığını gösterir.


15
Kitabın 1.1 sürümü çok eskidir. İşte daha iyi bir bağlantı: svnbook.red-bean.com/nightly/en/svn.branchmerge.tags.html
Quinn Taylor

1
kopyalanan dosyalar fazladan yer harcamaz
Carlos

424

kullanın:

svn copy http://svn.example.com/project/trunk \
      http://svn.example.com/project/tags/1.0 -m "Release 1.0"

Kısa gösterim:

cd /path/to/project
svn copy ^/trunk ^/tags/1.0 -m "Release 1.0"

36
Bunu cevap olarak işaretledim. Sadece bir ekstra not. Bagajda bir önceki revizyonu alıp "etiketleyebilirsiniz". komut: svn copy -r 123 " svn.example.com/project/trunk " " svn.example.com/project/tags/1.0 " -m "Etiketleme, ancak daha eski bir revizyon (123)."
granadaCoder

7
Ben svn: Yerel, taahhüt olmayan işlemler bir günlük iletisi veya revizyon özellikleri almaz , bu yüzden sadece -m seçeneğini kaldırın.
Jonny

4
Sadece bir FYI, URL'nizin http veya https dahil olmak üzere havuzunuzla eşleştiğinden emin olun.
Norman H

2
Neden ilk satırın sonunda \?
Fractaliste

1
@Jonny Yukarıdaki komutu "-m" seçeneği olmadan çalıştıramıyorum. Mac'te terminal kullanıyorum.
Abdurrahman Mubeen Ali

14

@Victor hugo tarafından belirtildiği gibi, "uygun" yol svn kopya kullanmaktır. Yine de bir uyarı var. Bu şekilde oluşturulan "etiket" gerçek bir etiket olmayacak, belirtilen düzeltmenin tam bir kopyası olacak, ancak farklı bir düzeltmenin kendisi olacaktır. Dolayısıyla, derleme sisteminiz bir şekilde svn revizyonundan yararlanıyorsa (örn. 'Svn info' ile elde ettiğiniz sayıyı oluşturduğunuz ürünün sürümüne dahil ediyorsa), bir etiketten tam olarak aynı ürünü oluşturamazsınız ( sonuç, orijinal kod yerine etiketi revize eder).

Görünüşe göre tasarım ile svn'de gerçekten uygun bir meta etiket oluşturmanın bir yolu yoktur.


4
"Son Değişiklik Rev" kullanmak mümkündür: echo "{ 'svnRev': \"`svn info | awk '/Last Changed Rev:/{print $4}'`\" }" >svnver.txt`
18446744073709551615

Bu şekilde, (elbette) farklı revizyon numaralarına sahip iki dal hala aynı yazılım sürümünü üretir.
13:50

1
Evet, Last Changed Rev konusunda haklısınız, ancak bu, tasarım gereği Subversion'da gerçek etiketler olmadığı gerçeğini değiştirmez.
Alexander Amelkin

@ 18446744073709551615: Şu awkbilgileri kullanarak doğrudan svn'den kullanmaktan kaçınabilir ve alabilirsiniz --show-item:svn info --show-item last-changed-revision
Luchostein

12

Sadece şunu kullanın:

svn  copy  http://svn.example.com/project/trunk  
           http://svn.example.com/project/branches/release-1
           -m  "branch for release 1.0"

(hepsi bir satırda, elbette.) Her zaman tüm trunk klasörünün ve içeriğinin bir dalını yapmalısınız. Tabii ki gövdenin alt kısımlarını dallamak mümkündür, ancak bu neredeyse hiç iyi bir uygulama olmayacaktır. Şubenin tam olarak gövdede olduğu gibi davranmasını istiyorsunuz ve bunun için tüm gövdeyi dallamanız gerekiyor.

Blogumda SVN kullanımının daha iyi bir özetini görün: SVN Essentials ve SVN Essentials 2


Sadece bagajdan checkoput ve senaryomla içerideysem nasıl görünmesi gerektiğini ayrıntılı bir şekilde açıklayabilir misiniz?
aholbreich

Trunk klasörünü teslim aldıysanız, deponun http adresini kullanmanız gerekir. Trunk klasörü önerilen desen kontrol beri bu temsil cevap güncelledik.
AgilePro

Bu cevap kabul edilen cevaptan nasıl farklı?
Daniel W.


7

@victor hugo ve @unwind doğrudur ve victor'un çözümü açık ara en basittir. Ancak, SVN projenizde dışsallara DİKKAT EDİN. Harici kitaplıklara başvurursanız, harici referanslara sahip dizinleri etiketlediğinizde, harici sürümün düzeltme referansı (etiket veya HEAD veya sayı olsun) değişmeden kalır.

Etiketlemenin bu yönünü ele almak için bir komut dosyası oluşturmak mümkündür, bu konuyla ilgili bir tartışma için şu SO makalesine bakın: Bir SVN kasasını dışsallarla etiketleme


5

Subversion deposunu etiketlemek için başka bir seçenek de etiketi svn: log özelliğine şu şekilde eklemektir:

   echo "TAG: your_tag_text" > newlog
   svn propget $REPO --revprop -r $tagged_revision >> newlog
   svn propset $REPO --revprop -r $tagged_revision -F newlog
   rm newlog

Son zamanlarda bunun etiketlemenin en "doğru" yolu olduğunu düşünmeye başladım. Bu şekilde ekstra revizyonlar oluşturmazsınız ("svn cp" ile yaptığınız gibi) ve yine de "svn log" çıktısında grep kullanarak tüm etiketleri kolayca çıkarabilirsiniz:

   svn log | awk '/----/ {
                      expect_rev=1;
                      expect_tag=0;
                  }
                  /^r[[:digit:]]+/ {
                      if(expect_rev) {
                          rev=$1;
                          expect_tag=1;
                          expect_rev=0;
                      }
                  }
                  /^TAG:/ {
                      if(expect_tag) {
                          print "Revision "rev", Tag: "$2;
                      }
                      expect_tag=0;
                  }'

Ayrıca, bu şekilde gerektiğinde etiketleri sorunsuz bir şekilde silebilirsiniz . Böylece etiketler tam bir meta bilgi haline geliyor ve hoşuma gidiyor.


0
svn copy http://URL/svn/trukSource http://URL/svn/tagDestination -m "Test tag code" 
  $error[0].Exception | Select-object Data

Tek yapmanız gereken URL yolunu değiştirmek. Bu komut yeni dir "tagDestination" oluşturur. İkinci satır, varsa tüm hata ayrıntılarını size bildirir. Oluşturulmazsa svn env değişkeni oluşturun. Kontrol edebilir (Cmd: - set, Powershell: - Get-ChildItem Env :) Varsayılan yol "C: \ Program Files \ TortoiseSVN \ bin \ TortoiseProc.exe"


-4

Bunu dene. Benim için çalışıyor:

mkdir <repos>/tags/Release1.0
svn commit <repos>/tags/Release1.0 
svn copy <repos>/trunk/* <repos>/tag/Release1.0
svn commit <repos/tags/Release1.0 -m "Tagging Release1.0"

1
Bu kesinlikle yanlış bir yol. (Release1.0) etiketi, rastgele oluşturulmuş bir dizin değil, kaynak dizinin (trunk) bir kopyası olmalıdır. Bunu yaptığınız gibi yaparsanız, kaynak dizinin kendisinin geçmişini kaybedersiniz ve yalnızca alt öğe düğümlerinin (dosyalar ve dizinler) geçmişini saklarsınız.
Alexander Amelkin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.