จะสร้างแท็ก SVN จากลำต้นได้อย่างถูกต้องได้อย่างไร?


282

ฉันกำลังสร้างโครงการแรกของฉันในการโค่นล้ม จนถึงตอนนี้ฉันมี

 branches
 tags
 trunk

ฉันคิดว่าฉันต้องทำให้สาขาเอกพจน์และเริ่มต้นใหม่ทันที สาขาการอัพเดทเป็นบรรทัดฐาน

ฉันทำงานในลำตัวและย้ายเนื้อหาไปยังแท็กดังต่อไปนี้

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

svn copyลำไส้ของฉันบอกฉันนี้เป็นสิ่งที่ผิดโดยสิ้นเชิงและฉันควรจะรักษาความสัมพันธ์ระหว่างไฟล์บางใช้ ไฟล์ที่ฉันสร้างในลักษณะนี้จะไม่มีความสัมพันธ์ซึ่งกันและกันและฉันแน่ใจว่าฉันจะพลาดคุณลักษณะการโค่นล้ม ฉันถูกไหม?

ฉันควรใช้ svn copy สำหรับแต่ละไฟล์หรือไม่?

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"

ฉันควรใช้สำเนา svn ในไดเรกทอรีทั้งหมดหรือไม่

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

10
น่าเสียดายที่ฉันไม่ได้เลือกทุกอย่างในกรณีนี้ ... คอมไพล์เป็นเวทย์มนตร์ที่น่ารัก
ojblass

คำตอบ:


186

คุณถูกต้องเนื่องจากมันไม่ "ถูกต้อง" ในการเพิ่มไฟล์ลงในโฟลเดอร์แท็ก

คุณเดาถูกต้องว่าcopyเป็นการใช้งาน มันช่วยให้การโค่นล้มติดตามประวัติของไฟล์เหล่านี้และ (ฉันสมมติว่า) เก็บไฟล์เหล่านั้นได้อย่างมีประสิทธิภาพมากขึ้น

จากประสบการณ์ของฉันดีที่สุดในการทำสำเนา ("สแนปชอต") ของโครงการทั้งหมดเช่นไฟล์ทั้งหมดจากตำแหน่งเช็คเอาต์รูท ด้วยวิธีนี้ภาพสแนปชอตสามารถยืนอยู่ได้ด้วยตนเองในฐานะตัวแทนที่แท้จริงของสถานะของโครงการทั้งหมด ณ เวลาใดเวลาหนึ่ง

ส่วนนี้ของ "หนังสือ"แสดงวิธีใช้คำสั่งโดยทั่วไป


15
หนังสือรุ่น 1.1 ล้าสมัยไปมากแล้ว นี่คือลิงค์ที่ดีกว่า: svnbook.red-bean.com/nightly/en/svn.branchmerge.tags.html
Quinn Taylor

1
ไฟล์ที่คัดลอกไม่ได้ใช้พื้นที่เพิ่มเติมใด ๆ
Carlos

424

ใช้:

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

ชวเลข:

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

36
ฉันทำเครื่องหมายว่านี่เป็นคำตอบ โน้ตย่อหนึ่งอัน คุณสามารถรับการแก้ไขก่อนหน้าของลำตัวและ "แท็ก" ได้เช่นกัน คำสั่ง: svn copy -r 123 " svn.example.com/project/trunk " " svn.example.com/project/tags/1.0 " -m "การติดแท็ก แต่ใช้รุ่นที่เก่ากว่า (123)"
granadaCoder

7
ฉันได้รับsvn: การดำเนินการในพื้นที่ไม่ใช่การกระทำไม่ได้ใช้ข้อความบันทึกหรือคุณสมบัติการแก้ไขดังนั้นฉันจึงลบตัวเลือก -m
จอนนี่

4
เป็นเพียง FYI ตรวจสอบให้แน่ใจว่า URL ของคุณตรงกับที่เก็บของคุณรวมถึง http หรือ https
นอร์แมน H

2
ทำไม \ ที่ท้ายบรรทัดแรก?
Fractaliste

1
@ Jonny ฉันไม่สามารถเรียกใช้คำสั่งด้านบนโดยไม่มีตัวเลือก "-m" ฉันใช้เทอร์มินัลกับ mac
Abdurrahman Mubeen Ali

14

ตามที่ระบุไว้โดย @victor hugo วิธี "เหมาะสม" คือการใช้สำเนา svn มีข้อแม้อย่างหนึ่งว่า "แท็ก" ที่สร้างขึ้นด้วยวิธีนี้จะไม่ใช่แท็กที่แท้จริง แต่จะเป็นสำเนาที่แน่นอนของการแก้ไขที่ระบุ แต่จะเป็นการแก้ไขอื่น ดังนั้นหากระบบการสร้างของคุณใช้การแก้ไข svn อย่างใด (เช่นรวมหมายเลขที่ได้รับด้วย 'ข้อมูล svn' เป็นรุ่นของผลิตภัณฑ์ที่คุณสร้าง) ดังนั้นคุณจะไม่สามารถสร้างผลิตภัณฑ์เดียวกันได้แน่นอนจากแท็ก ( ผลลัพธ์จะมีการแก้ไขแท็กแทนของรหัสเดิม)

ดูเหมือนว่าโดยการออกแบบไม่มีวิธีใน svn เพื่อสร้างเมตาแท็กที่เหมาะสมอย่างแท้จริง


4
เป็นไปได้ที่จะใช้ "Last Changed Rev": echo "{ 'svnRev': \"`svn info | awk '/Last Changed Rev:/{print $4}'`\" }" >svnver.txt`
18446744073709551615

ด้วยวิธีนี้สองสาขาที่มีหมายเลขการตรวจทานที่แตกต่างกัน (แน่นอน) ยังคงผลิตซอฟต์แวร์เวอร์ชั่นเดียวกัน
18446744073709551615

1
ใช่คุณถูกต้องเกี่ยวกับ Last Changed Rev แต่นั่นไม่ได้เปลี่ยนความจริงที่ว่าโดยการออกแบบไม่มีแท็กจริงในการโค่นล้ม
Alexander Amelkin

@ 18446744073709551615: คุณสามารถหลีกเลี่ยงการใช้awkและรับข้อมูลนั้นได้โดยตรงจาก svn โดยใช้--show-itemตัวเลือก:svn info --show-item last-changed-revision
Luchostein

12

เพียงใช้สิ่งนี้:

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

(ทั้งหมดอยู่ในบรรทัดเดียว) คุณควรสร้างสาขาของโฟลเดอร์และเนื้อหาทั้งหมด แน่นอนว่ามันเป็นไปได้ที่จะแตกกิ่งก้านสาขาย่อยของลำต้น แต่มันก็แทบจะไม่มีทางปฏิบัติที่ดีเลย คุณต้องการให้กิ่งก้านทำงานเหมือนที่ลำต้นในตอนนี้และเพื่อให้เกิดขึ้นคุณจะต้องแตกกิ่งลำต้นทั้งหมด

ดูข้อมูลสรุปการใช้งาน SVN ได้ดีขึ้นที่บล็อกของฉัน: SVN EssentialsและSVN Essentials 2


คุณช่วยอธิบายได้ไหมว่าควรจะดูเป็นยังไงถ้าฉันแค่เช็คเอาต์จากลำตัวและอยู่ข้างในด้วยสคริปต์ของฉัน
aholbreich

หากคุณเช็คเอาต์โฟลเดอร์ trunk แล้วคุณต้องใช้ที่อยู่ http ของที่เก็บ ฉันได้อัปเดตคำตอบเพื่อแสดงสิ่งนี้ตั้งแต่เช็คเอาต์โฟลเดอร์ trunk เป็นรูปแบบที่แนะนำ
AgilePro

คำตอบนี้แตกต่างจากคำตอบที่ยอมรับได้อย่างไร
Daniel W.

11

1
ฉันจะสร้างระบบที่มีขนาดใหญ่กว่านี้ดังนั้นฉันจึงต้องมุ่งเน้นไปที่ฟังก์ชั่นหลักที่มีให้
ojblass

2
ขอบคุณ! บรรทัดคำสั่งอาจถูกต้อง แต่สิ่งนี้มีประโยชน์มากกว่า
Ray301

7

@victor hugo และ @unwind นั้นถูกต้องและทางออกของผู้ชนะนั้นง่ายที่สุด อย่างไรก็ตามระวังของ externals ในโครงการ SVN ของคุณ หากคุณอ้างอิงไลบรารีภายนอกการอ้างอิงการแก้ไขของภายนอก (ไม่ว่าจะเป็นแท็กหรือ HEAD หรือหมายเลข) จะยังคงไม่เปลี่ยนแปลงเมื่อคุณติดแท็กไดเรกทอรีที่มีการอ้างอิงภายนอก

เป็นไปได้ที่จะสร้างสคริปต์เพื่อจัดการกับลักษณะของการติดแท็กนี้สำหรับการอภิปรายในหัวข้อนั้นให้ดูที่บทความ SO นี้: การติดแท็กการชำระเงิน SVN ด้วย externals


5

ตัวเลือกอื่นในการติดแท็กพื้นที่เก็บข้อมูลการโค่นล้มคือการเพิ่มแท็กไปยัง svn: คุณสมบัติบันทึกเช่นนี้:

   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

ฉันเพิ่งเริ่มคิดว่านี่เป็นวิธีที่ถูกที่สุดในการติดแท็ก วิธีนี้คุณจะไม่สร้างการแก้ไขเพิ่มเติม (เช่นเดียวกับ "svn cp") และยังสามารถแยกแท็กทั้งหมดโดยใช้ grep บนเอาต์พุต "svn log":

   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;
                  }'

นอกจากนี้วิธีนี้คุณสามารถลบแท็กได้อย่างราบรื่นหากคุณต้องการ ดังนั้นแท็กจึงกลายเป็นข้อมูลเมตาที่สมบูรณ์และฉันชอบ


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

สิ่งที่คุณต้องทำคือเปลี่ยนพา ธ URL คำสั่งนี้จะสร้าง "tagDestination" dir ใหม่ บรรทัดที่สองจะแจ้งให้คุณทราบรายละเอียดข้อผิดพลาดแบบเต็มหากมีสิ่งใดเกิดขึ้น สร้างตัวแปร svn envหากไม่ได้สร้างขึ้น สามารถตรวจสอบได้ (cmd: - set, Powershell: - Get-ChildItem Env :) พา ธ เริ่มต้นคือ "C: \ Program Files \ TortoiseSVN \ bin \ TortoiseProc.exe"


-4

ลองสิ่งนี้ มันเหมาะกับฉัน:

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
นี่เป็นวิธีที่ผิดไปแน่นอน แท็ก (Release1.0) ควรเป็นสำเนาของไดเรกทอรีต้นทาง (trunk) ไม่ใช่ไดเรกทอรีที่สร้างขึ้นโดยพลการ หากคุณทำตามวิธีที่คุณทำคุณจะสูญเสียประวัติของไดเรกทอรีต้นทางเองและเก็บประวัติของโหนดที่สืบทอด (ไฟล์และไดเรกทอรี) เท่านั้น
Alexander Amelkin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.