git "ping": periksa apakah repositori jarak jauh ada

76

Saya ingin tahu apakah repositori jarak jauh ada. Inilah yang saya pikirkan:

git ls-remote -h "$REPO_URL" &> /dev/null

Apakah ada cara yang lebih baik?

Jo Liss
sumber
4
Sepertinya pilihan yang bagus. Overhead dari "pekerjaan ekstra" untuk mengambil dan memformat daftar referensi (yang kemudian dikirim ke /dev/null) harus cukup kecil.
Chris Johnsen
Jawabannya harus: Tidak, tidak ada cara yang lebih baik.
Timo

Jawaban:

70

Saya pikir git ls-remoteperintahnya cukup banyak dibuat untuk tujuan itu.

Peter Eisentraut
sumber
ya, ini sepertinya berhasil, tetapi bisakah Anda, tolong, berikan beberapa penjelasan dan katakan apakah ini 100% saya dapat mengkloning repo itu
vladkras
15

Jika Anda menggunakan --exit-codeargumen, Anda dapat melewatkan pengiriman ke null. Ini akan mengembalikan sesuatu hanya jika terjadi kesalahan.

Anda juga dapat menggunakan -hargumen untuk hanya menampilkan referensi kepala.

git ls-remote --exit-code -h "$REPO_URL"
Oleksiy Chystoprudov
sumber
-hadalah ide bagus. Namun, --exit-codebukan pilihan yang tepat di sini. Halaman manual mengatakan: Keluar dengan status "2" ketika tidak ada referensi yang cocok ditemukan di repositori jarak jauh. Ini berarti bahwa git ls-remote --exit-code "$REPO_URL"akan gagal untuk repo kosong yang baru saja diinisialisasi dengan git init.
Jo Liss
3

Anda dapat mempersempit output dengan menggunakan sesuatu seperti git ls-remote "$REPO_URL" HEAD

ony
sumber
Itu menggantung selamanya.
Timo
1
@Timo, maka Anda mungkin memiliki server yang tidak responsif atau koneksi Anda atau klien git yang rusak. Misalnya port jaringan difilter. Investigasi lebih lanjut agak mirip dengan apa yang terjadi ketika ping Anda tidak merespons :). Sebagai contoh, Anda dapat mencoba memeriksa apakah Anda membuat koneksi melalui netcat atau openssl s_client atau tracepath .
ony
0

TL; DR:

git ls-remote begini caranya, berikut adalah fungsi shell-ready untuk akses cepat:

  ## Returns errlvl 0 if $1 is a reachable git remote url 
  git-remote-url-reachable() {
      git ls-remote "$1" CHECK_GIT_REMOTE_URL_REACHABILITY >/dev/null 2>&1
  }

Pemakaian:

if git-remote-url-reachable "$url"; then
   ## code
fi

Apa yang sedang dilakukannya?

Ini hanya penyatuan yang nyaman dari semua komentar / solusi yang sebelumnya dinyatakan dengan beberapa tweak kecil, fungsi siap-tempel bash dan contoh kode penggunaan untuk membuatnya lebih jernih. Anda akan perhatikan bahwa:

  • itu membatasi output sebagai referensi diperiksa mungkin tidak ada, karena git masih akan keluar dengan tingkat kesalahan 0 pada ref tidak cocok . Satu-satunya perbedaan di sini adalah bahwa ada sedikit lebih sedikit keluaran untuk ditransfer di jaringan dibandingkan dengan meminta HEAD(dan jauh lebih sedikit daripada tidak meminta ref atau bahkan membatasi hanya kepala), dan ini juga lebih sedikit keluaran untuk digunakan /dev/null(tapi ini yang terakhir adalah mengambil waktu yang dapat diabaikan)

  • wasit yang diperiksa menjelaskan bahwa kami sedang menyelidiki keberadaannya , ini bisa membantu jika Anda ingin bersikap sopan dengan administrator server yang Anda selidiki dan memberi mereka kesempatan untuk memahami mengapa mereka menerima penyelidikan ini jika mereka memantau sesuatu.

vaab
sumber