Bisakah git beroperasi dalam "mode diam"?

106

Apakah mungkin untuk menjalankan perintah git dalam mode "diam"? Misalnya, dapatkah saya mengatakan " git push origin" dan tidak melihat apa pun yang ditampilkan di layar?

Saya kira saya dapat mengarahkan IO ke /dev/null(berfungsi dengan baik), tetapi .. apakah git mengizinkan hal seperti ini secara alami?

Di bawah ini adalah skrip cepat yang melakukan pengubahan EOD otomatis, digunakan ketika saya perlu naik kereta dan tidak ingin meninggalkan kode di komputer lokal saya

  1 clear
  2
  3 cd
  4 cd repo/active
  5
  6 for i in *
  7 do
  8   cd $i
  9   echo "Pushing " $i
 10   git add . -A >> /dev/null 
 11   git commit -a -m "EOD automatic commit" >> /dev/null 
 12   git push origin >> /dev/null 
 13   echo
 14   cd ..
 15 done

Tolong beritahu saya.

James Raitsev
sumber
1
Tidak terkait: daripada membungkus cmds dalam cd $ i, cd .., Anda dapat melakukan: for i in *; lakukan (cd $ i; ...;); selesai dan jalankan cd di subkulit. Ini tidak terlalu rapuh.
William Pursell
Mau memindahkan tanda "benar" ke jawaban ThomasEdwards? Itu benar-benar menjawab dengan cara "alami".
Christian
1
Saya ingin tahu apa yang ada dalam pikiran Linus ketika dia mengembangkan git, karena itu jelas melanggar salah satu aturan dasar UNIX yang mengatakan diam itu emas. Apa yang tidak dijawab di sini adalah apakah mungkin untuk menempatkan beberapa pengaturan di konfigurasi git untuk membuatnya menjadi warga UNIX yang baik sekali dan untuk selamanya.
Johan Boulé

Jawaban:

19

Mengalihkan output ke / dev / null sepertinya merupakan cara alami untuk melakukannya bagi saya. Meskipun saya sebelumnya telah mendefinisikan fungsi shell quiet_git seperti ini untuk digunakan dalam pekerjaan cron:

quiet_git() {
    stdout=$(tempfile)
    stderr=$(tempfile)

    if ! git "$@" </dev/null >$stdout 2>$stderr; then
        cat $stderr >&2
        rm -f $stdout $stderr
        exit 1
    fi

    rm -f $stdout $stderr
}

Ini akan menekan stdout dan stderr, kecuali jika perintah git gagal. Ini tidak cantik; sebenarnya file stdout diabaikan dan seharusnya hanya mengarahkannya ke / dev / null. Bekerja, meskipun. Dan kemudian Anda bisa melakukan "quiet_git push" dll. Nanti di skrip.

araqnid
sumber
10
Lihat jawaban @ThomasEdwards, jauh lebih baik
Robin Winslow
240

Anda dapat menggunakan --quietatau -q, yang juga dapat digunakan untuk perintah Git lainnya:

git commit --quiet
git push --quiet
Thomas Edwards
sumber
2
Sepertinya aku tidak bisa diam karena melakukan seperti ini. Ini mengabaikan salah satu bendera.
GaryBishop
8
Anda perlu menambahkannya setelah perintah. git pull -qatau git push origin master --quiet. Saya di git 1.8.x
Mendhak
7
@Mendhak, tidak berfungsi (setidaknya tidak diam). Misalnya git pull -q origin master > /dev/nullmenghasilkan "Total 4 (delta 3), digunakan kembali 4 (delta 3)". Itu dengan git 2.0.1.
Matthew Flaschen
3
Bahkan saat menggunakan --queit (atau -q), beberapa output masih dicetak. Misalnya, saat menggunakan git checkout -q (branch_name), jika ini adalah pertama kalinya cabang diperiksa, itu akan mencetak pesan yang mengatakan cabang baru telah disiapkan. Apakah ada (beberapa bendera) yang menggunakan semua keluaran seperti itu dapat dibungkam?
Ankur
6
Jika Anda benar-benar menginginkan keluaran NO , gunakan git command >/dev/null 2>&1. Ini mengalihkan stdout dan stderr ke / dev / null. The --quietopsi untuk menghasilkan output ringkas, bukan untuk menekan keluaran seluruhnya @Ankur
Brandon
17

Menggunakan &> /dev/nulldi bagian akhir memberi Anda keluaran perintah git yang sepenuhnya senyap.

git fetch origin master &> /dev/null
Hans Kristian
sumber
1
Hanya di csh, sebagian besar merekomendasikan melakukan skrip shell menggunakan shell bourne.
hd1
@ hd1 no, &>adalah operator pengalihan IO bash. Lihat 3.6 di sini tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
Hans Kristian
@HansKrisian ya, bash menghadirkan fitur interaktif dari csh dan skrip dari sh bersama. Mengutip dari howto yang sama: "Bash adalah shell yang kompatibel dengan sh yang menggabungkan fitur-fitur berguna dari shell Korn (ksh) dan C shell (csh)".
hd1
1
Tujuannya adalah untuk menghapus pesan informasional, tetapi masih menampilkan kesalahan. Saya belum mempelajari seberapa baik perilaku git tentang apa yang masuk ke stdout dan apa yang masuk ke stderr, tetapi mengarahkan kedua baunya seperti ide yang sangat buruk.
Johan Boulé
6

Perhatikan bahwa bahkan dengan --quiet , a git fetch(yang memicu a git gc) akan menghasilkan beberapa keluaran.
Itu karena git gcbagian dari file git fetch.

Tidak lagi, mulai git 2.1.1 (Sept 2014): lihat commit 6fceed3bea59d747c160972c67663e8b8c281229 dari Nguyễn Thái Ngọc Duy ( pclouds)

ambil: diam git-gcjika --quietdiberikan

builtin/fetch.c:

argv_array_pushl(&argv_gc_auto, "gc", "--auto", NULL);
if (verbosity < 0)
argv_array_push(&argv_gc_auto, "--quiet");
run_command_v_opt(argv_gc_auto.argv, RUN_GIT_CMD);
VonC
sumber