Buat daftar semua svn: eksternal secara rekursif?

94

Bagaimana saya bisa mendapatkan daftar semua svn: externals (rekursif) dalam sebuah direktori? Apakah ada kegunaan untuk ini?

(Saya menggunakan Windows (dan tortoise))

Saya memiliki banyak svn: eksternal yang menautkan ke bagian bersama yang berbeda dari proyek saya dan saya ketika saya bercabang biasanya cukup rawan kesalahan untuk menemukan semua eksternal dan mengubahnya sehingga tautan ke jalur dalam cabang baru.

Niels Bosma
sumber
Pertanyaan ini juga ada di stackoverflow.com/questions/5118320/…
Thiago Burgos

Jawaban:

147

Lakukan hal berikut di root copy pekerjaan Anda:

svn propget svn:externals -R

Seperti yang dibahas dalam komentar di bawah, ini tidak mencantumkan eksternal di eksternal.

Catatan untuk pengguna TortoiseSVN: ada opsi dalam penginstal TortoiseSVN untuk juga menginstal klien baris perintah SVN. Opsi ini tidak diaktifkan secara bawaan.

Wim Coenen
sumber
yang hanya memberi saya daftar semua eksternal dan di mana mereka menunjuk .. tetapi bukan 'lokasi' dari eksternal .. yaitu jika saya memiliki lib \ my_ex sebagai eksternal saya hanya mendapatkan my_ex http: / svnlinkdi sini
ShoeLace
4
@ShoeLace: Anda harus bekerja dengan SVN yang lebih lama karena di 1.6.1 keluarannya memang berisi informasi ini.
Wim Coenen
1
Maaf, tetapi saya harus memilihnya karena a) ini tidak akan menampilkan semua eksternal; fx, jika kita memiliki folder eksternal dan ada eksternal di suatu tempat di dalam folder ini - ini tidak akan muncul b) pertanyaannya ditandai tortoise svn, tetapi jawabannya terkait dengan baris perintah klien
pmod
2
@pmod: a) Saya tidak tahu itu, tapi bagi saya sepertinya bug SVN dan bukan kesalahan di pihak saya. b) Penginstal TortoiseSVN 1.7 menyertakan klien baris perintah!
Wim Coenen
1
Rekursif berkaitan dengan struktur folder dari copy pekerjaan tempat Anda menjalankan perintah. Ini tidak berkaitan dengan eksternal yang bersarang di dalam eksternal. Jadi menurut saya itu bukan bug. Jika tidak, ini akan membuat operasi semakin tidak dapat digunakan dalam hal durasi.
Frank
15

Mengubah semua properti eksternal tersebut secara manual terdengar membosankan. Pernahkah Anda melihat fungsionalitas baru untuk eksternal yang ditambahkan di Subversion 1.5?

Subversion 1.5 mengambil langkah besar dalam meredakan frustrasi ini. Seperti disebutkan sebelumnya, URL yang digunakan dalam format definisi eksternal baru bisa bersifat relatif, dan Subversion menyediakan keajaiban sintaks untuk menentukan beberapa ragam relativitas URL.

../

    Sehubungan dengan URL direktori tempat properti svn: externals disetel

^ /

    Sehubungan dengan root repositori tempat properti svn: externals diversi

//

    Sehubungan dengan skema URL direktori tempat properti svn: externals disetel

/

    Sehubungan dengan URL root server tempat properti svn: externals diversi

Mungkin salah satu dari itu akan membantu? Saya kira itu tergantung pada bagaimana Anda bercabang dan seperti apa struktur repositori Anda.

Sebastian Celis
sumber
9

Solusi saya untuk TortoiseSVN:

Buka dialog "Cabang / tag ..." dari menu konteks SVN. Dialog bawah menampilkan semua eksternal termasuk eksternal bersarang.

DrRobotNinja
sumber
Sepertinya TortoiseSVN tidak mencari svn: externals secara rekursif di dalam svn: externals, jadi ini sama dengan melakukan svn propget svn:externals -R.
paulie4
0

Mungkin, sebagai solusinya, Anda dapat menyusun proyek Anda sedemikian rupa sehingga semua eksternal diatur pada folder yang sama, misalnya pada folder proyek tepat di bawah Trunk. (Ini tidak berarti bahwa semua folder eksternal harus memiliki kedalaman yang sama.) Kemudian Anda dapat mengklik kanan pada folder proyek Anda, kemudian Properties ..., lalu tab Subversion, lalu Properties ... lalu klik dua kali svn: externals.

Pengecut Anonim
sumber
0

Saya menggunakan jawaban Wim Coenen dan menulis skrip berikut untuk membuat daftar semua revisi:

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
}

Untungnya, saya tidak memiliki eksternal bersarang, jadi saya tidak perlu menguji ini dan saya rasa itu tidak akan berhasil. Tetapi jika Anda membutuhkan ini, mungkin cukup memanggil fungsi ini secara rekursif. Juga, saya tidak pernah menguji dengan nama file yang perlu keluar. Sepertinya tidak akan berhasil.

PENOLAKAN: Saya tahu pertanyaan aslinya adalah tentang windows, dan skrip shell tidak akan berfungsi di sana kecuali Anda menggunakan cygwin atau serupa.

Daniel Alder
sumber
0

Saya mengambil jawaban Daniel Alder , menghapus panggilan svnversion, dan membuatnya berulang (CATATAN: read a b c d etidak berfungsi jika ada spasi di sumber atau tujuan). Ini adalah skrip bash, jadi Anda memerlukan sesuatu seperti Cygwin atau menggunakan Subsistem Windows untuk 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
}
paulie4
sumber