Liệt kê tất cả svn: externals đệ quy?


94

Làm cách nào tôi có thể lấy danh sách tất cả svn: externals (đệ quy) trong một thư mục? Có tiện ích nào cho việc này không?

(Tôi đang sử dụng Windows (và rùa))

Tôi có một loạt svn: externals liên kết đến các phần được chia sẻ khác nhau trong dự án của tôi và tôi khi tôi phân nhánh thường khá dễ xảy ra lỗi khi tìm tất cả các bên ngoài và thay đổi chúng để liên kết đến các đường dẫn trong nhánh mới.


Câu hỏi này cũng có tại stackoverflow.com/questions/5118320/…
Thiago Burgos

Câu trả lời:


144

Thực hiện như sau trong thư mục gốc của bản sao làm việc của bạn:

svn propget svn:externals -R

Như đã thảo luận trong các nhận xét bên dưới, điều này không liệt kê các yếu tố bên ngoài trong các yếu tố bên ngoài.

Lưu ý cho người dùng TortoiseSVN: có một tùy chọn trong trình cài đặt TortoiseSVN cũng có thể cài đặt ứng dụng khách dòng lệnh SVN. Tùy chọn này không được bật theo mặc định.


mà chỉ mang lại cho tôi một danh sách của tất cả các externals và nơi họ chỉ .. nhưng không phải là 'vị trí' của bên ngoài .. tức là nếu tôi có lib \ my_ex như một i bên ngoài chỉ get my_ex http: / svnlinkhere
dây giày

4
@ShoeLace: bạn phải làm việc với SVN cũ hơn vì trong 1.6.1 đầu ra chứa thông tin này.
Wim Coenen

1
Xin lỗi nhưng tôi phải bỏ phiếu vì a) điều này sẽ không xuất ra tất cả các bên ngoài; fx, nếu chúng ta có bên ngoài để thư mục và có một đâu đó bên ngoài bên trong thư mục này - điều này sẽ không hiển thị b) câu hỏi là được gắn thẻ rùa svn, nhưng câu trả lời liên quan đến dòng lệnh của khách hàng
pmod

2
@pmod: a) Tôi không biết điều đó, nhưng nó có vẻ là một lỗi SVN đối với tôi hơn là lỗi từ phía tôi. b) Trình cài đặt TortoiseSVN 1.7 bao gồm máy khách dòng lệnh!
Wim Coenen

1
Tính đệ quy liên quan đến cấu trúc thư mục của bản sao làm việc mà bạn gọi lệnh. Nó không liên quan đến các bên ngoài lồng vào bên trong các bên ngoài. Vì vậy, tôi không nghĩ rằng nó là một lỗi. Nếu không, điều này sẽ làm cho hoạt động thậm chí không thể sử dụng được về thời lượng.
Frank Rem

15

Thay đổi thủ công tất cả các thuộc tính bên ngoài đó nghe có vẻ tẻ nhạt. Bạn đã xem xét chức năng mới cho các phần tử bên ngoài được thêm vào trong Subversion 1.5 chưa?

Subversion 1.5 thực hiện một bước tiến lớn trong việc giải tỏa những thất vọng này. Như đã đề cập trước đó, các URL được sử dụng trong định dạng định nghĩa bên ngoài mới có thể là tương đối và Subversion cung cấp phép thuật cú pháp để chỉ định nhiều loại tính tương đối của URL.

../

    Liên quan đến URL của thư mục mà thuộc tính svn: externals được đặt trên đó

^ /

    Liên quan đến gốc của kho lưu trữ trong đó thuộc tính svn: externals được tạo phiên bản

//

    Liên quan đến lược đồ URL của thư mục mà thuộc tính svn: externals được đặt trên đó

/

    Liên quan đến URL gốc của máy chủ mà thuộc tính svn: externals được tạo phiên bản

Có lẽ một trong số đó sẽ giúp ích? Tôi đoán nó phụ thuộc vào chính xác cách bạn đang phân nhánh và cấu trúc kho lưu trữ của bạn trông như thế nào.


8

Giải pháp của tôi cho TortoiseSVN:

Mở hộp thoại "Chi nhánh / thẻ ..." từ trình đơn ngữ cảnh SVN. Hộp thoại bên dưới hiển thị tất cả các bên ngoài bao gồm các bên ngoài lồng nhau.


Có vẻ như TortoiseSVN không tìm kiếm một cách đệ quy svn: externals trong svn: externals, vì vậy điều này cũng giống như thực hiện svn propget svn:externals -R.
paulie 4

0

Có thể, như một giải pháp thay thế, bạn có thể cấu trúc dự án của mình theo cách sao cho tất cả các thiết bị bên ngoài được đặt trên cùng một thư mục, ví dụ như trên thư mục dự án ngay bên dưới Trunk. (Điều này không có nghĩa là tất cả các thư mục bên ngoài phải có cùng độ sâu.) Sau đó, bạn có thể nhấp chuột phải vào thư mục dự án của mình, sau đó là Thuộc tính ..., sau đó là tab Subversion, sau đó là Thuộc tính ... sau đó bấm đúp vào svn: externals.


0

Tôi đã sử dụng câu trả lời của Wim Coenen và viết đoạn mã sau để tạo danh sách tất cả các bản sửa đổi:

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
}

May mắn thay, tôi không có các bên ngoài lồng nhau, vì vậy tôi không phải kiểm tra điều này và tôi đoán nó sẽ không hoạt động. Nhưng nếu bạn cần điều này, có lẽ chỉ cần gọi hàm này một cách đệ quy là đủ. Ngoài ra, tôi chưa bao giờ thử nghiệm với các tên tệp cần thoát. Nó có thể sẽ không hoạt động sau đó.

KHUYẾN CÁO: Tôi biết câu hỏi ban đầu là về windows và shell script sẽ không hoạt động ở đó trừ khi bạn đang sử dụng cygwin hoặc tương tự.


0

Tôi đã lấy câu trả lời của Daniel Alder , loại bỏ các lệnh gọi svnversion và làm cho nó đệ quy (LƯU Ý: read a b c d ekhông hoạt động nếu có khoảng trắng trong nguồn hoặc đích). Đây là một tập lệnh bash, vì vậy bạn sẽ cần một cái gì đó như Cygwin hoặc sử dụng Hệ thống con của Windows cho Linux .

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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.