ความแตกต่างระหว่างผู้แต่งและผู้เดินทางใน Git?


237

ฉันพยายามที่จะกระทำเช่นนี้

git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"

ที่ John Doe คือผู้ใช้บางคนที่ฉันต้องการจะส่งมอบชื่อ

ดูเหมือนว่าจะgit logเรียบร้อยแล้ว แต่เมื่อฉันทำgitk, ชื่อผู้เขียนที่ถูกต้อง แต่ชื่อ committer จะเลือกจากการตั้งค่าการกำหนดค่าคอมไพล์ทั่วโลกของฉัน (และมีการตั้งค่าจึงชื่อ / อีเมล์ของฉัน)

คำถาม

  1. ความแตกต่างระหว่างทั้งสอง (committer กับผู้เขียน) คืออะไร?

  2. ฉันควรตั้งค่าผู้สื่อสารด้วยให้กับผู้ใช้รายอื่นหรือไม่

  3. ถ้าใช่เป็นอย่างไร


4
jasonnoble.org/2009/04/github-set-authorcommitter.htmlที่นี่เป็นคำอธิบายสั้น ๆ
RenéHöhle


คอมมิทเตอร์ของ Git ถูกวางในไฟล์. gitconfig หากคุณ - ผู้อนุญาตเหมือนกับชื่อ. gitconfig คุณจะได้รับเฉพาะผู้เขียนในการส่งข้อความ หากพวกมันต่างกันคุณจะได้ทั้งคู่
poGUIst

คำตอบ:


216

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

ความแตกต่างระหว่างทั้งสอง (Committer กับผู้เขียน) คืออะไร?

ผู้เขียนคือคนที่เขียนรหัสในตอนแรก ในทางกลับกันผู้นั้นจะถือว่าเป็นผู้ที่ส่งมอบรหัสในนามของผู้เขียนต้นฉบับ สิ่งนี้มีความสำคัญใน Git เนื่องจาก Git อนุญาตให้คุณเขียนประวัติใหม่หรือนำ patch มาใช้แทนบุคคลอื่น ฟรีออนไลน์Pro Gitหนังสืออธิบายเช่นนี้

คุณอาจจะสงสัยว่าสิ่งที่แตกต่างระหว่างผู้เขียนและcommitter ผู้เขียนเป็นคนที่ แต่เดิมเขียนแพทช์ในขณะที่committerเป็นคนที่ใช้ล่าสุดออกแพทช์ ดังนั้นถ้าคุณส่งแพตช์ไปยังโครงการและหนึ่งในสมาชิกหลักใช้แพทช์คุณทั้งสองได้รับเครดิต - คุณในฐานะผู้เขียนและสมาชิกหลักเป็นผู้ดำเนินการ

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

ฉันควรตั้งค่าผู้สื่อสารด้วยให้กับผู้ใช้รายอื่นหรือไม่

ไม่ถ้าคุณต้องการที่จะซื่อสัตย์คุณไม่ควรตั้งค่าผู้ส่งให้ผู้เขียนเว้นแต่ผู้แต่งและผู้ส่งเป็นบุคคลเดียวกัน


1
ฉันยังสับสนเกี่ยวกับเรื่องนี้ ฉันเกิดสิ่งนี้ขึ้นและในกรณีของฉันเท่าที่ฉันรู้ว่าจะไม่มีการแก้ไขหรือแก้ไขประวัติเกิดขึ้น (เว้นแต่คำสั่ง git บางคำจะสร้างและนำ patch มาใช้อย่างกว้างขวาง "ภายใต้ประทุน") นี่เป็นเพียง 2 วิธีสำหรับสิ่งที่เกิดขึ้นแบบนี้จริงหรือ
cowlinator

2
นอกจากนี้การเรียกผู้เขียนถึง "คนที่เขียนรหัส" ก็ไม่สมเหตุสมผล คอมไพล์จะรู้ได้อย่างไรว่าใครเป็นคนเขียน? เมื่อคุณตั้งค่าgit config userและจากนั้นgit addและgit commitจากนั้นคอมไพล์จะรู้ว่าใครเพิ่มและผู้ที่มุ่งมั่น แต่ก็ยังจะไม่ทราบว่าใครเป็นคนเขียน
ประสานงาน

1
@cowlinator ไม่รู้ว่าใครเป็นคนเขียนรหัส นั่นเป็นเหตุผลที่คุณต้องบอกถ้าไม่ใช่คุณ โปรดทราบว่าระบบการควบคุมเวอร์ชันที่เผยแพร่ก่อนหน้านี้ก่อนที่จะประดิษฐ์คอมไพล์กำลังส่ง ~~ Linus ~~ อีเมลผู้ดูแลโครงการพร้อมด้วยแพทช์ที่จะใช้ ฟังก์ชั่นนี้มีดังนั้น ~~ Linus ~~ ผู้ดูแลระบบสามารถใช้ปะของคุณในขณะที่ยังคงให้เครดิตคุณในรูปแบบ 'เป็นทางการ' แทนที่จะเป็นเพียงเฉพาะกิจในข้อความยืนยัน
คดีฟ้องร้องกองทุนโมนิกา

92

รายชื่อผู้รับจดหมายgit format-patch++ git applyสามารถสร้างผู้เขียนได้!

ในโครงการเช่นเคอร์เนล Linux ที่เป็นปะ:

สร้างการคอมมิทใหม่หนึ่งครั้งกับผู้แต่งและคอมมิทเตอร์ต่าง ๆ :

  • ผู้เขียนคือผู้เขียนแพทช์
  • ผู้เดินทางคือใครเป็นผู้ดูแลโครงการและผู้รวมการแก้ไข

ดูตัวอย่างนี้แพทช์ที่เลือกแบบสุ่มและการกระทำที่สอดคล้องกัน:

ส่วนต่อประสานเว็บ Git เช่น GitHub และ GitLab อาจสร้างหรือไม่สร้างผู้เขียน!

เนื่องจาก Git (Hub | Lab) มีทั้งที่เก็บอัปสตรีมและที่เก็บส้อมบนเครื่องเดียวกันพวกเขาจึงสามารถทำสิ่งใดก็ได้ที่คุณสามารถทำได้ภายในเครื่องโดยอัตโนมัติรวมถึง:

  • สร้างการรวมการกระทำ

    ไม่สร้างผู้เขียน! = committer

    เก็บ SHA หรือการคอมมิทใหม่ไว้เหมือนเดิมและสร้างการคอมมิทใหม่:

    * Merge commit (committer == author == project maintainer)
    |\
    | * Feature commit (committer == author == contributor)
    |/
    * Old master (random committer and author)
    

    ในอดีตนี่เป็นวิธีแรกที่มีให้บน GitHub

    git merge --no-ffในประเทศนี้จะทำด้วย

    สิ่งนี้สร้างสองคอมมิตต่อการร้องขอแบบดึงและเก็บทางแยกในประวัติคอมไพล์

  • rebase ที่ด้านบนของ master

    GitHub ยังแฮ็กคอมมิทเพื่อตั้งค่าคอมมิทเตอร์ == ใครก็ตามที่กดปุ่มเวียน สิ่งนี้ไม่ได้บังคับและไม่ได้ทำโดยค่าเริ่มต้นในgit rebaseเครื่อง แต่จะให้ความรับผิดชอบแก่ผู้ดูแลโครงการ

    ต้นไม้ git ตอนนี้ดูเหมือนว่า:

    * Feature commit (committer == maintainer, author == contributor)
    |
    * Old master (random committer and author)    
    

    ซึ่งเหมือนกับของgit applyแพทช์อีเมล

บน GitHub ปัจจุบัน:

  • คุณเลือกวิธีเมื่อทำการผสานผ่านเมนูแบบเลื่อนลงที่ปุ่มผสาน
  • วิธีการสามารถเปิดหรือปิดการใช้งานในการตั้งค่า repo โดยเจ้าของ

https://help.github.com/articles/about-merge-methods-on-github/

วิธีตั้งค่าคอมมิทเตอร์ของคอมมิทใหม่?

สิ่งที่ดีที่สุดที่ฉันสามารถหาได้คือการใช้ตัวแปรสภาพแวดล้อมเพื่อแทนที่คอมมิทเตอร์:

GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'

จะรับผู้ส่งและส่งมอบวันที่ที่กำหนดได้อย่างไร

git logเพียงแสดงให้เห็นว่าข้อมูลที่เขียนโดยเริ่มต้นใน

หากต้องการดูวันที่จ่ายเงินคุณสามารถ:

  • จัดรูปแบบบันทึกโดยเฉพาะสำหรับสิ่งนั้น:

    git log --pretty='%cn %cd' -n1 HEAD
    

    ที่cnและcdยืนอยู่Committer NameและCommitter Date

  • ใช้fullerรูปแบบที่กำหนดไว้ล่วงหน้า:

    git log --format=fuller
    

    ดูเพิ่มเติม: วิธีกำหนดค่า 'บันทึก git' เพื่อแสดง 'วันที่ส่งมอบ'

  • ไปที่ระดับต่ำและแสดงข้อมูลการส่งทั้งหมด:

    git cat-file -p HEAD
    

วิธีตั้งค่าวันที่ส่งของการส่งข้อมูลใหม่

git commit --date ตั้งค่าวันที่ของผู้เขียนเท่านั้น: สำหรับวันที่ส่งมอบสิ่งที่ดีที่สุดที่ฉันสามารถหาได้คือกับตัวแปรสภาพแวดล้อม:

GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000' git commit --date='2000-01-01T00:00:00+0000'

ดูเพิ่มเติม: ความแตกต่างระหว่างผู้แต่งและผู้เดินทางใน Git คืออะไร?

Git เก็บผู้แต่งกับผู้เดินทางภายในได้อย่างไร

ดู: รูปแบบไฟล์ของคอมมิทการคอมมิตคืออะไร?

โดยทั่วไปการคอมมิทคือไฟล์ข้อความและมันมีสองฟิลด์ที่คั่นด้วยสองบรรทัด:

author {author_name} <{author_email}> {author_date_seconds} {author_date_timezone}
committer {committer_name} <{committer_email}> {committer_date_seconds} {committer_date_timezone}

สิ่งนี้ทำให้ชัดเจนว่าทั้งสองเป็นรายการข้อมูลอิสระที่สมบูรณ์ในวัตถุกระทำ


1
หมายเหตุว่าแม้จะมีGIT_COMMITTER_*การแทนที่, คอมไพล์จะยังคงปฏิเสธที่จะดำเนินการกระทำถ้าคุณยังไม่ได้ตั้ง committer git configเริ่มต้นใช้
adelphus

1
@adelphus ใน Git 2.5 มันไม่ทำงานถ้าคุณตั้งค่าทั้งสองGIT_{COMMITTER,AUTHOR}_EMAIL
Ciro Santilli郝海东冠状病六四事件法轮功

3

@Ciro Santilli 法轮功改造中心六四事件法轮功เสนอให้ใช้

GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'

เพื่อหลีกเลี่ยงการซ้ำชื่อและอีเมลคุณสามารถใช้ซ้ำได้

GIT_COMMITTER_NAME='a'; GIT_COMMITTER_EMAIL='a'; git commit --author "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"

ซึ่งชุดแรกตัวแปรในคำสั่งแยกจากนั้นใช้พวกเขาสำหรับการgit commitโทร (หมายเหตุวงเล็บคู่)

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