Git เตือนฉันหรือไม่ว่ารหัสคอมมิตชวเลขสามารถอ้างถึงคอมมิตที่แตกต่างกัน 2 รายการ


130

หากcee157สามารถอ้างถึง 2 รหัสคอมมิตที่แตกต่างกันเช่น

cee157eb799af829a9a0c42c0915f55cd29818d4 และ cee1577fecf6fc5369a80bd6e926ac5f864a754b

Git จะเตือนฉันไหมถ้าฉันพิมพ์git log cee157? (หรือ Git 1.8.5.2 (Apple Git-48) ให้ฉันพิมพ์ได้git log cee1)

ฉันคิดว่าควรแม้ว่าฉันจะไม่พบแหล่งข้อมูลที่เชื่อถือได้ที่บอกว่ามันจะเป็นเช่นนั้น


4
ดูman gitrevisionsซึ่งอย่างน้อยก็แสดงถึงคำเตือนเนื่องจากระบุว่าคุณสามารถตั้งชื่อการแก้ไขด้วยชื่อ SHA1-1 แบบเต็มหรือ "สตริงย่อยนำหน้าที่ไม่ซ้ำกันภายในที่เก็บ"
chepner

5
คุณมี 17 ข้อตกลงที่แตกต่างกันหรือไม่? เพียงแค่ลองgit log c... และดู
djechlin

1
ใน ELL ฉันอาจตั้งค่าสถานะนี้เป็น [ข้อมูลอ้างอิงทั่วไป]
justhalf

3
@djechlin ฉันต้องการตัวเลขอย่างน้อย 4 หลัก git log abcกล่าวว่าfatal: ambiguous argument 'abc': unknown revision or path not in the working tree.แม้ว่าผมจะมี SHA1 abcที่ไม่ซ้ำกันเริ่มต้นด้วย ใช้ไม่ได้กับตัวเลข 1-2-3 หลัก 4 ดูเหมือนจะต่ำสุด ทดสอบใน Windows (1.8.1) และ Mac (1.9.1)
ม.ค.

4
@janos นั่นเป็นเพราะenvironment.hกำหนดminimum_abbrevค่าเป็น4.
devnull

คำตอบ:


168

ควรให้สิ่งนี้แก่คุณ:

$ git log cee157
error: short SHA1 cee157 is ambiguous.
error: short SHA1 cee157 is ambiguous.
fatal: ambiguous argument 'cee157': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

ฉันเพิ่งทดสอบสิ่งนี้กับที่เก็บ Git จริงโดยค้นหาการกระทำที่มีคำนำหน้าซ้ำกันเช่นนี้:

git rev-list master | cut -c-4 | sort | uniq -c | sort -nr | head

สิ่งนี้จะนำรายการของการแก้ไขเข้าmasterมาตัดอักขระ 4 ตัวแรกและโยนส่วนที่เหลือออกนับรายการที่ซ้ำกันและเรียงลำดับตามตัวเลข ในพื้นที่เก็บข้อมูลที่ค่อนข้างเล็กของฉันประมาณ 1500 คอมมิตฉันพบว่ามีการแก้ไขเล็กน้อยพร้อมคำนำหน้า 4 หลักทั่วไป ฉันเลือกคำนำหน้า 4 หลักเพราะดูเหมือนว่าความยาวตามกฎหมายที่สั้นที่สุดที่ Git รองรับ (ใช้ไม่ได้กับตัวเลข 3 หลักหรือน้อยกว่าแม้ว่าจะไม่คลุมเครือก็ตาม)

Btw นี่ไม่ใช่การพิมพ์ผิดฉันไม่รู้ว่าทำไมข้อความแสดงข้อผิดพลาดเกี่ยวกับ SHA1 ที่ไม่ชัดเจนจึงปรากฏขึ้นสองครั้งโดยไม่คำนึงถึงจำนวน SHA1 ที่ซ้ำกัน (ลองด้วย 2 และ 3):

error: short SHA1 cee157 is ambiguous.
error: short SHA1 cee157 is ambiguous.

(เปิดทั้งคู่stderrจริงๆแล้วเอาต์พุตทั้งหมดเปิดอยู่stderrไม่มีอะไรเปิดstdout)

ทดสอบใน Windows:

$ git --version
git version 1.8.1.msysgit.1

ฉันคิดว่ามันปลอดภัยที่จะบอกว่าหากเวอร์ชันของคุณ> = 1.8.1 Git จะเตือนคุณถึงรายการที่ซ้ำกัน (จะปฏิเสธที่จะดำเนินการกับรายการที่ซ้ำกัน) ฉันเดาว่าเวอร์ชันเก่า ๆ ก็ใช้งานได้เช่นกัน

UPDATE

เมื่อทดสอบสิ่งนี้คุณต้องมี SHA1 อย่างน้อย 4 หลักเนื่องจากint minimum_abbrev = 4อยู่ในสภาพแวดล้อม c . (ขอบคุณ@devnull ที่ชี้ให้เห็น!)


5
ข้อผิดพลาดปรากฏขึ้นสองครั้งแม้ว่าจะมีมากกว่าสองคอมมิตที่มีคำนำหน้าตรงกันหรือไม่
นิตย์

4
@ ใช่แม้ว่าจะมี 3 dups ข้อความจะปรากฏขึ้นสองครั้ง อัปเดตคำตอบของฉันเพื่อชี้แจงว่า
ม.ค.

1
เมื่อพิจารณาจากโครงสร้างของซอร์สโค้ด git ดูเหมือนว่าหนึ่งในสองเอาต์พุตเป็นคำเตือนและอีกอันมีข้อผิดพลาด ไม่แน่ใจว่า
Izkata

1
@MarkHurd ทั้งสองบน stderr. จริงๆแล้วผลลัพธ์ทั้งหมดอยู่บน stderr ไม่มีอะไรอยู่บน stdout (ซึ่งสมเหตุสมผล)
มกราคม

63

โปสเตอร์ต้นฉบับระบุว่า:

ฉันคิดว่าควรแม้ว่าฉันจะไม่พบแหล่งข้อมูลที่เชื่อถือได้ที่บอกว่ามันจะเป็นเช่นนั้น

get_short_sha1()แหล่งเผด็จการสามารถพบได้ในรหัสที่มา

อ้างถึงสิ่งนี้ :

if (!quietly && (status == SHORT_NAME_AMBIGUOUS))
    return error("short SHA1 %.*s is ambiguous.", len, hex_pfx);

และสิ่งนี้ :

if (!ds->candidate_checked)
    /*
     * If this is the only candidate, there is no point
     * calling the disambiguation hint callback.
     *
     * On the other hand, if the current candidate
     * replaced an earlier candidate that did _not_ pass
     * the disambiguation hint callback, then we do have
     * more than one objects that match the short name
     * given, so we should make sure this one matches;
     * otherwise, if we discovered this one and the one
     * that we previously discarded in the reverse order,
     * we would end up showing different results in the
     * same repository!
     */
    ds->candidate_ok = (!ds->disambiguate_fn_used ||
                        ds->fn(ds->candidate, ds->cb_data));

if (!ds->candidate_ok)
    return SHORT_NAME_AMBIGUOUS;

นอกจากนี้ยังมีการทดสอบเพื่อให้แน่ใจว่าคุณลักษณะนี้ทำงานได้ตามที่คาดไว้

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