คอมไพล์ทำงานใน "โหมดเงียบ" ได้ไหม


106

เป็นไปได้ไหมที่จะรันคำสั่ง git ในโหมด "silent"? เช่นฉันพูดได้ไหม "git push origin " และไม่เห็นสิ่งใดปรากฏบนหน้าจอได้หรือไม่

ฉันคิดว่าฉันสามารถเปลี่ยนเส้นทาง IO ไปที่ /dev/null (ใช้งานได้ดี) แต่ .. git ยอมให้บางสิ่งเช่นนี้เป็นธรรมชาติหรือไม่?

ด้านล่างนี้เป็นสคริปต์ด่วนที่ทำ EOD อัตโนมัติซึ่งใช้เมื่อฉันต้องขึ้นรถไฟและไม่ต้องการทิ้งรหัสไว้บนคอมพิวเตอร์ในพื้นที่ของฉัน

  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

กรุณาแจ้งให้เราทราบ


1
ไม่เกี่ยวข้อง: แทนที่จะห่อ cmds ใน cd $ i, cd .. คุณสามารถทำได้: for i in *; ทำ (cd $ i; ... ;); เสร็จสิ้นและเรียกใช้ cd ใน subshell เปราะบางน้อยกว่านี้
William Pursell

ต้องการย้ายเครื่องหมาย "ถูกต้อง" ไปที่คำตอบ ThomasEdwards หรือไม่? มันตอบโจทย์ด้วยวิถี "ธรรมชาติ" จริงๆ
คริสเตียน

1
ฉันสงสัยว่า Linus คิดอย่างไรเมื่อเขาพัฒนาคอมไพล์เพราะมันทำลายกฎพื้นฐานของ UNIX อย่างชัดเจนที่บอกว่าความเงียบเป็นสีทอง สิ่งที่ไม่ได้รับคำตอบคือถ้าเป็นไปได้ที่จะใส่การตั้งค่าบางอย่างในการกำหนดค่าของ git เพื่อให้เป็นพลเมือง UNIX ที่ดีทุกครั้ง
Johan Boulé

คำตอบ:


19

การเปลี่ยนเส้นทางเอาต์พุตเป็น / dev / null ดูเหมือนเป็นวิธีที่เป็นธรรมชาติในการทำกับฉัน แม้ว่าในอดีตฉันได้กำหนดฟังก์ชันเปลือก quiet_git ไว้เช่นนี้เพื่อใช้ในงาน 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
}

สิ่งนี้จะระงับ stdout และ stderr เว้นแต่คำสั่ง git จะล้มเหลว มันไม่สวย ในความเป็นจริงไฟล์ stdout ถูกละเว้นและควรเปลี่ยนเส้นทางไปที่ / dev / null ใช้งานได้แม้ว่า จากนั้นคุณสามารถทำ "quiet_git push" เป็นต้นในสคริปต์ได้ในภายหลัง


10
ดูคำตอบของ @ThomasEdwards ดีกว่ามาก
Robin Winslow

241

คุณสามารถใช้--quietหรือ-qซึ่งสามารถใช้กับคำสั่ง Git อื่น ๆ ได้:

git commit --quiet
git push --quiet

2
ดูเหมือนว่าฉันจะปิดปากคอมมิทต์แบบนี้ไม่ได้ มันละเว้นแฟล็กอย่างใดอย่างหนึ่ง
GaryBishop

8
คุณต้องเพิ่มหลังจากคำสั่ง git pull -qหรือgit push origin master --quiet. ฉันใช้คอมไพล์ 1.8.x
Mendhak

7
@Mendhak ไม่ทำงาน (อย่างน้อยก็ไม่เงียบ) เช่นgit pull -q origin master > /dev/nullให้ผล "Total 4 (delta 3), reused 4 (delta 3)" นั่นคือ git 2.0.1
Matthew Flaschen

3
แม้ว่าจะใช้ --queit (หรือ -q) ก็ยังพิมพ์เอาต์พุตบางส่วน ตัวอย่างเช่นเมื่อใช้ git checkout -q (branch_name) หากเป็นครั้งแรกที่มีการเช็คเอาต์สาขาระบบจะพิมพ์ข้อความแจ้งว่ามีการตั้งค่าสาขาใหม่ มี Someway (บางแฟล็ก) ที่ใช้ซึ่งสามารถปิดเสียงเอาต์พุตทั้งหมดได้หรือไม่?
Ankur

6
ถ้าคุณต้องการจริงไม่มีgit command >/dev/null 2>&1การส่งออกใช้ สิ่งนี้เปลี่ยนเส้นทางทั้ง stdout และ stderr ไปที่ / dev / null --quietตัวเลือกสำหรับการสร้างผลผลิตรวบรัดไม่ได้สำหรับการระงับการส่งออกทั้งหมด @Ankur
แบรนดอน

17

การใช้&> /dev/nullในตอนท้ายจะให้เอาต์พุตคำสั่ง git ที่เงียบสนิท

git fetch origin master &> /dev/null

1
เฉพาะใน csh เท่านั้นส่วนใหญ่แนะนำให้ทำเชลล์สคริปต์โดยใช้ bourne เชลล์
hd1

@ hd1 ไม่ใช่&>เป็นตัวดำเนินการเปลี่ยนเส้นทาง Bash IO ดู 3.6 ที่นี่ tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
Hans Kristian

@HansKrisian ใช่ bash นำคุณสมบัติแบบโต้ตอบจาก csh และสคริปต์จาก sh เข้าด้วยกัน อ้างจาก howto เดียวกัน: "Bash คือเชลล์ที่เข้ากันได้กับ sh ซึ่งรวมเอาคุณสมบัติที่เป็นประโยชน์จาก Korn เชลล์ (ksh) และ C เชลล์ (csh)"
hd1

1
จุดประสงค์คือเพื่อลบข้อความที่ให้ข้อมูล แต่ยังคงแสดงข้อผิดพลาด ฉันไม่ได้ศึกษาว่าคอมไพล์มีพฤติกรรมที่ดีเพียงใดเกี่ยวกับสิ่งที่จะไปสู่ ​​stdout และสิ่งที่จะไปที่ stderr แต่การเปลี่ยนเส้นทางทั้งสองกลิ่นเป็นความคิดที่ไม่ดี
Johan Boulé

6

หมายเหตุว่าแม้มี --quietการgit fetch(ซึ่งเรียกgit gc) จะสร้างการส่งออกบางส่วน
นั่นเป็นเพราะgit gcส่วนหนึ่งของgit fetch.

ไม่ใช่อีกต่อไปเริ่มต้น git 2.1.1 (กันยายน 2014): ดูกระทำ 6fceed3bea59d747c160972c67663e8b8c281229จาก NguyễnTháiNgọc Duy ( pclouds)

เรียก: เงียบgit-gcถ้า--quietได้รับ

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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.