จะคอมไพล์อะไรโดยไม่มีข้อผิดพลาดได้อย่างไร?


92

ฉันกำลังพยายามเขียนสคริปต์ผ้าที่ทำ a git commit; 1แต่ถ้ามีอะไรที่จะกระทำออกคอมไพล์กับสถานะของ สคริปต์การปรับใช้ถือว่าไม่สำเร็จและออกจากระบบ ฉันต้องการตรวจจับความล้มเหลวที่เกิดขึ้นจริงดังนั้นฉันจึงไม่สามารถเพิกเฉยต่อgit commitความล้มเหลวของผ้าได้ ฉันจะปล่อยให้ความล้มเหลวของการคอมมิตว่างถูกละเว้นได้อย่างไรเพื่อให้การปรับใช้ดำเนินต่อไปได้ แต่ยังตรวจจับข้อผิดพลาดที่เกิดขึ้นเมื่อการคอมมิตจริงล้มเหลว

def commit():
    local("git add -p && git commit")

คำตอบ:


157

จับเงื่อนไขนี้ไว้ก่อนโดยตรวจสอบรหัสออกของ git diff?

ตัวอย่างเช่น (ในเชลล์):

git add -A
git diff-index --quiet HEAD || git commit -m 'bla'

แก้ไข: แก้ไขgit diffคำสั่งตามความคิดเห็นของ Holger


64
โปรดทราบว่าgit diffเป็นคำสั่ง "porcelain" ที่ไม่ควรใช้สำหรับการเขียนสคริปต์ git diff-index --quiet HEAD || git commit -m 'bla'สิ่งที่คุณมีแนวโน้มที่ต้องการมากที่สุดคือ ดูคำตอบนี้ด้วย
Holger

1
เพื่ออธิบายสิ่งต่างๆเพิ่มเติมปัญหาgit diff --quiet --exit-code --cachedคือจะประเมินเป็น1(เท็จ) เฉพาะสำหรับไฟล์ที่แก้ไขซึ่งไม่ได้ถูกจัดเตรียมไว้สำหรับการกระทำ (ไฟล์ที่ไม่ได้เพิ่ม) ความคิดเห็นที่ได้รับการโหวตเป็นทางออกที่ดีที่สุดในการพิจารณาไฟล์ใหม่และการลบ
Jorge Bucaran

2
ความคิดเห็นเกี่ยวกับgit diff-index --quiet HEAD || git commit -m 'bla'ควรเป็นคำตอบในคำถามนี้
Rakib

1
เนื่องจากโทบิไม่สนใจที่จะแก้ไขคำตอบของเขาตามความคิดเห็นของโฮลเกอร์ฉันจึงแก้ไขคำตอบของเขาเอง
vog

โปรดทราบว่า git diff-index --quiet HEAD ไม่ได้ทดสอบว่าที่เก็บโลคัลเป็นปัจจุบันกับต้นทางหรือไม่
bortzmeyer

62

จากgit commitหน้าคน:

--allow-empty
    Usually recording a commit that has the exact same tree as its
    sole parent commit is a mistake, and the command prevents you
    from making such a commit. This option bypassesthe safety, and
    is primarily for use by foreign SCM interface scripts.

43
สิ่งนี้จะสร้างความมุ่งมั่น
ThiefMaster

6
@ThiefMaster: ถูกต้อง ฉันไม่สามารถบอกได้จาก OP ว่าเป็นปัญหาหรือไม่ ฉันเดาว่าถ้าคุณใช้การคอมมิตอัตโนมัติคุณก็ไม่สนใจว่าประวัติของคุณจะสะอาดอยู่แล้ว
Sven Marnach

1
ฉันไม่ต้องการที่จะกระทำหากสามารถหลีกเลี่ยงได้ มีวิธีทำไหม?
kojiro

3
นี่ไม่ใช่คำตอบสำหรับคำถาม
manojlds

7
@manojlds: "แน่นอนว่า OP ไม่ต้องการสร้างคอมมิตที่ว่างเปล่า" วันนี้ฉันทิ้งลูกแก้วไว้ที่บ้านฉันก็เลยไม่รู้ -pแม้ว่าจะพลาดไปแต่ก็ยัง
Sven Marnach

5
with settings(warn_only=True):
  run('git commit ...')

สิ่งนี้ทำให้ Fabric เพิกเฉยต่อความล้มเหลว มีข้อได้เปรียบของการไม่สร้างคอมมิตเปล่า ๆ

คุณสามารถห่อไว้ในเลเยอร์เพิ่มเติมwith hide('warnings'):เพื่อระงับเอาต์พุตโดยสิ้นเชิงมิฉะนั้นคุณจะได้รับหมายเหตุในเอาต์พุตแฟบริคว่าคอมมิตล้มเหลว (แต่ fabfile ยังคงดำเนินการต่อไป)


3
OP เขียนว่า "ฉันต้องการตรวจจับความล้มเหลวที่เกิดขึ้นจริง "; รหัสนี้จะซ่อนทุกความล้มเหลวของการกระทำ
bfontaine

-2

ลอง / จับลูก!

from fabric.api import local
from fabric.colors import green


def commit(message='updates'):
    try:
        local('git add .')
        local('git commit -m "' + message + '"')
        local('git push')
        print(green('Committed and pushed to git.', bold=False))
    except:
        print(green('Done committing, likely nothing new to commit.', bold=False))

10
เพื่ออธิบายว่าเหตุใดคุณจึงถูกลดคะแนน: อาจมีข้อผิดพลาดอื่น ๆ ที่คุณต้องการตรวจสอบ คุณไม่ต้องการเพียงแค่คิดว่าในกรณีที่เกิดข้อผิดพลาดอาจเป็นไปได้ว่าไม่มีอะไรต้องทำ - นอกจากนี้ แต่ไม่เกี่ยวข้อง: อย่าใช้แบบทั่วไปexcept:ใช้except Exceptionหรือมากกว่านั้นแทน
Albert
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.