Saya menulis serangkaian skrip untuk manajemen Git di zsh.
Bagaimana saya memeriksa apakah direktori saat ini adalah repositori Git? (Ketika saya tidak dalam repo Git, saya tidak ingin menjalankan banyak perintah dan mendapatkan banyak fatal: Not a git repository
tanggapan).
$GIT_DIR
atau$GIT_WORK_TREE
lingkungan, atau bagaimana mereka berinteraksi.Jawaban:
Disalin dari file penyelesaian bash, berikut ini adalah cara naif untuk melakukannya
Anda bisa membungkusnya dalam suatu fungsi atau menggunakannya dalam skrip.
Dikondensasi menjadi kondisi satu baris yang cocok untuk bash dan zsh
sumber
git rev-parse --is-inside-git-dir
. Saya pribadi menggunakangit rev-parse --is-inside-work-tree
sebelum mengatur PS1 saya.--is-inside-git-dir
hanya akan mengembalikan true jika Anda benar-benar berada di dalam.git
direktori repositori. Saya tidak berpikir OP mencari itu.--is-inside-work-tree
tidak--is-inside-git-dir
akan bekerja ketika Anda berada di luar git repo. lihat: groups.google.com/forum/#!topic/git-users/dWc23LFhWxE.git
. Untuk ketahanan, abaikan[ -d .git ]
dan gunakan sajagit rev-parse ...
.Kamu bisa memakai:
Yang akan mencetak 'true' jika Anda berada di pohon kerja git repos.
Perhatikan bahwa masih mengembalikan output ke STDERR jika Anda berada di luar git repo (dan tidak mencetak 'false').
Diambil dari jawaban ini: https://stackoverflow.com/a/2044714/12983
sumber
git rev-parse --show-toplevel
cocok dengan subfolder yang saya periksaGunakan git rev-parse --git-dir
sumber
Atau Anda bisa melakukan ini:
sumber
-e
mode:[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]
Tidak yakin apakah ada cara yang dapat diakses publik / didokumentasikan untuk melakukan ini (ada beberapa fungsi git internal yang dapat Anda gunakan / penyalahgunaan dalam sumber git itu sendiri)
Anda bisa melakukan sesuatu seperti;
sumber
Berdasarkan jawaban @Alex Cory :
tidak mengandung operasi yang berlebihan dan berfungsi dalam
-e
mode.git rev-parse
berhasil, mengabaikan hasilnya.git
perintah hanya valid di dalam worktree. Jadi untuk tujuan skrip, Anda kemungkinan besar tertarik bukan hanya di dalam "git repo" tetapi di dalam sebuah worktree.sumber
[
sama sekali. Lakukan sajaif git rev-parse --is-inside-work-tree; then ...
(dengan pengalihan yang diinginkan.)Solusi lain adalah memeriksa kode keluar perintah.
Ini akan mencetak 1 jika Anda berada di folder repositori git.
sumber
.git
direktori - yang mungkin atau tidak Anda inginkan.git rev-parse 2>&-
,.Jawaban ini memberikan contoh fungsi shell POSIX dan contoh penggunaan untuk melengkapi jawaban @ jabbie .
git
mengembalikan errorlevel0
jika berada di dalam repositori git, jika tidak maka akan mengembalikan errorlevel128
. (Ini juga mengembalikantrue
ataufalse
jika ada di dalam repositori git.)Contoh penggunaan
sumber
.git
, itu akan berhasil tetapi cetakfalse
.git rev-parse --is-inside-work-tree
kembalitrue
ataufalse
kemudian itu ada di dalam git repo, dan itulah fungsi yang dikembalikan. artinya, fungsinya benarini bekerja untuk saya. Anda masih mendapatkan kesalahan tetapi cukup mudah untuk ditekan. itu juga bekerja dari dalam subfolder!
status git> / dev / null 2> & 1 && gema Hello World!
Anda dapat memasukkan ini ke dalam pernyataan if lalu jika Anda perlu melakukan lebih banyak persyaratan.
sumber
git status
bisa sangat lambat pada repo besar / lama. Saya tidak akan menggunakannya untuk tujuan ini.Mengapa tidak menggunakan kode keluar? Jika repositori git ada di direktori saat ini, maka
git branch
dangit tag
perintah mengembalikan kode keluar dari 0; jika tidak, kode keluar yang tidak nol akan dikembalikan. Dengan cara ini, Anda dapat menentukan apakah repositori git ada atau tidak. Cukup, Anda dapat menjalankan:Keuntungan : Flexibe. Ia bekerja untuk repositori telanjang dan non-telanjang, dan di sh, zsh dan bash.
Penjelasan
git tag
: Mendapatkan tag dari repositori untuk menentukan apakah ada atau tidak.> /dev/null 2>&1
: Mencegah dari mencetak apa pun, termasuk output normal dan kesalahan.[ $? -eq 0 ]
: Periksa apakah perintah sebelumnya dikembalikan dengan kode keluar 0 atau tidak. Seperti yang Anda ketahui, setiap jalan keluar yang tidak nol berarti sesuatu yang buruk terjadi.$?
mendapatkan kode keluar dari perintah sebelumnya, dan[
,-eq
dan]
melakukan perbandingan.Sebagai contoh, Anda dapat membuat file bernama
check-git-repo
dengan konten berikut, membuatnya dapat dieksekusi dan menjalankannya:sumber
# periksa apakah git repo
sumber
[
di sini sama sekali. Lakukan saja:if git rev-parse --is-inside-work-tree > /dev/null 2>&1; then ....
Terima kasih ivan_pozdeev , Sekarang saya memiliki tes jika di dalam direktori .git kode tidak akan berjalan sehingga tidak ada kesalahan yang dicetak atau status keluar salah.
" ! [[$ (Pwd) = .git / || $ (pwd) = * .git]] " menguji jika Anda tidak berada di dalam repo .git maka ia akan menjalankan perintah git. Perintah tipe builtin digunakan untuk memeriksa apakah Anda telah menginstal git atau masih dalam PATH Anda. lihat jenis bantuan
sumber
Bagaimana dengan ini:
sumber
Anda dapat menambah atau mengganti $ PS1 Anda di zshrc Anda dengan satu atau beberapa alat git-prompt lainnya. Dengan cara ini Anda dapat dengan mudah mengetahui apakah Anda berada dalam git repo dan status repo itu ada.
sumber
Itu! Meniadakan jadi bahkan jika Anda menjalankan ini di direktori yang bukan repo git itu tidak akan memberi Anda beberapa kesalahan fatal
The > / dev / null 2> & 1 mengirim pesan ke / dev / null karena Anda baru saja keluar dari status keluar. The {} adalah untuk pengelompokan perintah sehingga semua perintah setelah || akan berjalan jika git rev-parse berhasil karena kita menggunakan a! yang meniadakan status keluar dari git rev-parse. The printf hanya untuk mencetak beberapa pesan dan git status mencetak status repo.
Bungkus dalam suatu fungsi atau letakkan dalam naskah. Semoga ini membantu
sumber
.git
, itu akan berhasil tetapi cetakfalse
.