แสดงรายการ svn: externals ซ้ำทั้งหมด?


94

ฉันจะรับรายการ svn: externals ทั้งหมด (เรียกซ้ำ) ในไดเร็กทอรีได้อย่างไร มียูทิลิตี้สำหรับสิ่งนี้หรือไม่?

(ฉันใช้ Windows (และเต่า))

ฉันมี svn: externals จำนวนมากที่เชื่อมโยงไปยังส่วนที่แชร์ต่าง ๆ ในโครงการของฉันและฉันเมื่อฉันแยกสาขามักจะมีข้อผิดพลาดค่อนข้างมากที่จะค้นหาภายนอกทั้งหมดและเปลี่ยนแปลงเพื่อให้ลิงก์ไปยังเส้นทางภายในสาขาใหม่


คำถามนี้มีอยู่ที่ stackoverflow.com/questions/5118320/…
Thiago Burgos

คำตอบ:


147

ทำสิ่งต่อไปนี้ในรูทของสำเนางานของคุณ:

svn propget svn:externals -R

ตามที่กล่าวไว้ในความคิดเห็นด้านล่างนี้จะไม่แสดงรายการภายนอกในภายนอก

หมายเหตุสำหรับผู้ใช้ TortoiseSVN: มีตัวเลือกในตัวติดตั้ง TortoiseSVN เพื่อติดตั้งไคลเอ็นต์บรรทัดคำสั่ง SVN ด้วย ตัวเลือกนี้ไม่ได้เปิดใช้งานโดยค่าเริ่มต้น


นั่นทำให้ฉันมีรายชื่อภายนอกทั้งหมดและจุดที่ชี้ .. แต่ไม่ใช่ 'ตำแหน่ง' ของภายนอก .. กล่าวคือถ้าฉันมี lib \ my_ex เป็นภายนอกฉันจะได้รับ my_ex เท่านั้น http: / svnlinkhere
ShoeLace

4
@ShoeLace: คุณจะต้องทำงานร่วมกับพี่ SVN เพราะใน 1.6.1 การส่งออกไม่มีข้อมูลนี้
Wim Coenen

1
ขออภัยฉันต้องลงคะแนนเนื่องจาก a) สิ่งนี้จะไม่ส่งออกจากภายนอกทั้งหมด fx ถ้าเรามีภายนอกไปยังโฟลเดอร์และมีภายนอกอยู่ภายในโฟลเดอร์นี้จะไม่ปรากฏขึ้น b) คำถามถูกแท็กเต่า svn แต่คำตอบเกี่ยวข้องกับไคลเอนต์บรรทัดคำสั่ง
pmod

2
@pmod: a) ฉันไม่รู้ แต่ดูเหมือนว่าเป็นข้อผิดพลาด SVN สำหรับฉันมากกว่าข้อผิดพลาดในส่วนของฉัน b) โปรแกรมติดตั้ง TortoiseSVN 1.7 มีไคลเอนต์บรรทัดคำสั่ง!
Wim Coenen

1
การวนซ้ำเป็นไปตามโครงสร้างโฟลเดอร์ของสำเนาการทำงานที่คุณเรียกใช้คำสั่ง ไม่เกี่ยวกับสิ่งภายนอกที่ซ้อนอยู่ภายในภายนอก เลยไม่คิดว่าเป็นบั๊ก มิฉะนั้นจะทำให้การดำเนินการใช้งานไม่ได้มากขึ้นในแง่ของระยะเวลา
Frank

15

การเปลี่ยนคุณสมบัติภายนอกทั้งหมดด้วยตนเองนั้นฟังดูน่าเบื่อ คุณได้ดูฟังก์ชันใหม่สำหรับภายนอกที่เพิ่มเข้ามาใน Subversion 1.5 แล้วหรือยัง?

การโค่นล้ม 1.5 เป็นขั้นตอนใหญ่ในการบรรเทาความผิดหวังเหล่านี้ ดังที่ได้กล่าวไว้ก่อนหน้านี้ URL ที่ใช้ในรูปแบบนิยามภายนอกใหม่อาจเป็นแบบสัมพัทธ์และการโค่นล้มจัดเตรียมความมหัศจรรย์ทางไวยากรณ์สำหรับการระบุความสัมพันธ์ของ URL หลายรสชาติ

../

    สัมพันธ์กับ URL ของไดเร็กทอรีที่ตั้งค่าคุณสมบัติ svn: externals

^ /

    สัมพันธ์กับรูทของที่เก็บซึ่งมีการกำหนดเวอร์ชันคุณสมบัติ svn: externals

//

    สัมพันธ์กับโครงร่างของ URL ของไดเร็กทอรีที่ตั้งค่าคุณสมบัติ svn: externals

/

    สัมพันธ์กับ URL รูทของเซิร์ฟเวอร์ที่กำหนดเวอร์ชันคุณสมบัติ svn: externals

บางทีหนึ่งในนั้นจะช่วย? ฉันเดาว่ามันขึ้นอยู่กับว่าคุณแตกแขนงอย่างไรและโครงสร้างที่เก็บของคุณมีลักษณะอย่างไร


9

วิธีแก้ปัญหาของฉันสำหรับ TortoiseSVN:

เปิดกล่องโต้ตอบ "สาขา / แท็ก ... " จากเมนูบริบท SVN กล่องโต้ตอบด้านล่างจะแสดงภายนอกทั้งหมดรวมถึงภายนอกที่ซ้อนกัน


ดูเหมือนว่า TortoiseSVN ไม่ซ้ำมองหา SVN: ภายนอกภายใน SVN: externals svn propget svn:externals -Rดังนั้นนี้เป็นเช่นเดียวกับการทำ
paulie4

0

บางทีในการแก้ปัญหาชั่วคราวคุณสามารถจัดโครงสร้างโครงการของคุณในลักษณะที่ตั้งค่าภายนอกทั้งหมดในโฟลเดอร์เดียวกันตัวอย่างเช่นในโฟลเดอร์โครงการที่อยู่ด้านล่าง Trunk (นี่ไม่ได้หมายความว่าโฟลเดอร์ภายนอกทั้งหมดจะต้องมีความลึกเท่ากัน) จากนั้นคุณสามารถคลิกขวาที่โฟลเดอร์โปรเจ็กต์ของคุณจากนั้น Properties ... จากนั้นแท็บ Subversion จากนั้น Properties ... จากนั้น ดับเบิลคลิก svn: externals


0

ฉันใช้คำตอบของ Wim Coenen และเขียนสคริปต์ต่อไปนี้เพื่อสร้างรายการการแก้ไขทั้งหมด:

getSvnRevs() {
  cd "$1"
  wcver="$(svnversion)"
  [ -n "$wcver" ] || panic "Unable to get version for $wcdir"
  echo "$1: $wcver"
  svn propget svn:externals -R | while read a b c d e; do
    [ -n "$a" ] || continue
    if [ "$b" = "-" ]; then
      wcparent="$a"
      wcdir="$wcparent/$c"
      [ -z "$e" ] || panic "Invalid format #1"
    else
      [ -n "$wcparent" ] || panic "Invalid format #2"
      wcdir="$wcparent/$a"
      [ -z "$c" ] || panic "Invalid format #3"
    fi
    [ -d "$wcdir" ] || panic "Invalid directory: $wcdir"
    wcver="$(svnversion "$wcdir")"
    [ -n "$wcver" ] || panic "Unable to get version for $wcdir"
    echo "$1/$wcdir: $wcver"
  done
}

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

การปฏิเสธความรับผิด: ฉันรู้ว่าคำถามเดิมเกี่ยวกับ windows และเชลล์สคริปต์จะไม่ทำงานที่นั่นเว้นแต่คุณจะใช้ cygwin หรือคล้ายกัน


0

ฉันรับคำตอบของ Daniel Alderลบการโทรแบบ svnversion และทำให้เกิดการเรียกซ้ำ (หมายเหตุ: ใช้read a b c d eไม่ได้หากมีช่องว่างในต้นทางหรือปลายทาง) นี้เป็นสคริปต์ทุบตีดังนั้นคุณจะได้ทั้งความจำเป็นบางอย่างเช่น Cygwin หรือใช้ระบบย่อย Windows สำหรับลินุกซ์

getSvnExternals() {
  svnbase="$1"
  svnpath="$2"
  svn propget svn:externals -R "$svnbase/$svnpath" 2> /dev/null | while read a b c d e; do
    [ -n "$a" ] || continue
    if [ "$b" = "-" ]; then
      wcparent="$a"
      external="$c"
      wcdir=$(echo "$wcparent/$d" | sed s#^./##)
      [ -z "$e" ] || echo "WARNING: Invalid format #1. line='$a $b $c $d $e'"
    else
      [ -n "$wcparent" ] || echo "WARNING: Invalid format #2. wcparent=$wcparent"
      external="$a"
      wcdir=$(echo "$wcparent/$b" | sed s#^./##)
      [ -z "$c" ] || echo "WARNING: Invalid format #3. line='$a $b $c $d $e'"
    fi
    echo "$1/$wcdir: $external"
    ## recurse into external directory
    [ -d "$wcdir" ] && getSvnExternals "$1/$wcdir"
  done
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.