Claude Code เพิ่มอะไรใน Git commit ของคุณบ้าง
Claude Code จะเพิ่ม Co-authored-by ใน commit และแนบลิงก์ claude.ai ใน pull request ตรวจสอบรูปแบบข้อความเหล่านี้ก่อน push ข้อมูลขึ้น repository สาธารณะเพื่อความเป็นส่วนตัว
สิ่งที่ Claude Code ใส่ไว้ใน commit
Claude Code จะเพิ่ม Co-authored-by: trailer ไว้ที่ท้ายข้อความ commit ที่มันเขียนขึ้น และเพิ่มบรรทัดระบุแหล่งที่มาไว้ในคำอธิบายของ pull request ที่มันเปิดขึ้นมา สำหรับเซสชันที่ทำงานบนคลาวด์หรือผ่าน Remote Control จะมีการแนบลิงก์ไปยังเซสชันนั้นบน claude.ai ไว้ด้วย ทั้งหมดนี้เป็นข้อความธรรมดาที่ถูกจัดเก็บไว้ในประวัติ git ของคุณ เมื่อคุณ push ข้อมูลเหล่านี้ไปยัง repository สาธารณะ ข้อมูลก็จะกลายเป็นสาธารณะและจะคงอยู่ที่นั่นจนกว่าจะมีใครแก้ไขประวัติ git ใหม่
ถ้อยคำที่แน่นอนอาจมีการเปลี่ยนแปลงไปในแต่ละ release ดังนั้นอย่าเชื่อถือข้อความ trailer ที่คัดลอกมาจากคู่มือใดๆ รวมถึงคู่มือฉบับนี้ด้วย ให้ตรวจสอบจาก commit ของคุณเองแทน คำสั่ง git ด้านล่างนี้เป็นส่วนที่คงทนถาวรของหัวข้อนี้ เนื่องจากวิธีการจัดการ trailer ของ git ทำงานในรูปแบบเดิมมาหลายปีแล้ว และจะยังคงทำงานในลักษณะเดิมต่อไปแม้ว่า release ถัดไปจะมีการเปลี่ยนแปลงข้อความก็ตาม
Git trailer คืออะไร
Trailer คือบรรทัดที่มีรูปแบบเหมือน Token: value ซึ่งอยู่ในบล็อกสุดท้ายของข้อความ commit Git ไม่ได้กำหนดรายการของ token ไว้ตายตัว Signed-off-by:, Reviewed-by:, Fixes: และ Co-authored-by: เป็นเพียงข้อตกลงที่สร้างขึ้นบนกลไกเดียวกัน โดยที่ forge หรือเว็บไซต์ที่โฮสต์ repository เช่น GitHub หรือ GitLab จะอ่านค่าเหล่านี้เพื่อตัดสินใจว่าจะแสดงข้อมูลอะไรบนหน้า commit
Git มีกฎที่เข้มงวดเกี่ยวกับตำแหน่งของบล็อกดังกล่าว เอกสารของ git interpret-trailers ระบุว่ากลุ่มของ trailer ต้องมีบรรทัดว่างหนึ่งบรรทัดหรือมากกว่านำหน้า ต้องอยู่ท้ายสุดของข้อความหรืออยู่ก่อนบรรทัดที่ขึ้นต้นด้วย --- ทันที และต้องประกอบด้วย trailer ทั้งหมด หรือ "มี trailer ที่สร้างโดย Git หรือกำหนดค่าโดยผู้ใช้อย่างน้อยหนึ่งรายการ และมีสัดส่วนของ trailer อย่างน้อย 25% ของบล็อก"
กฎข้อสุดท้ายนี้มีความสำคัญ URL เปล่าๆ หรือข้อความทั่วไปที่อยู่ในบล็อกสุดท้ายจะไม่ถือเป็น trailer และหากมีบรรทัดที่ไม่ใช่ trailer มากเกินไป จะทำให้บล็อกทั้งหมดไม่ถูกประมวลผลเป็น trailer นี่คือเหตุผลที่ commit อาจดูเหมือนมีบรรทัด Co-authored-by: อยู่ แต่เครื่องมือที่อ่านค่า trailer อย่างถูกต้องกลับมองไม่เห็นข้อมูลใดๆ เลย
ฉันจะอ่าน trailer ที่อยู่ในประวัติการทำงานของฉันได้อย่างไร
เริ่มต้นด้วยข้อความดิบของ commit ล่าสุด
git log -1 --format=%B%B จะแสดงหัวข้อและเนื้อหาตามที่จัดเก็บไว้จริง โดยไม่มีการตัดคำหรือจัดรูปแบบใหม่ ผลลัพธ์นี้คือข้อมูลต้นฉบับที่ถูกต้องที่สุด สิ่งที่แพลตฟอร์มจัดการโค้ดแสดงให้คุณเห็นเป็นเพียงการเรนเดอร์ข้อมูลนี้เท่านั้น
จากนั้นให้ตรวจสอบกับ git ว่าบรรทัดใดบ้างที่ถูกนับเป็น trailer
git log -1 --format=%B | git interpret-trailers --parse--parse เป็นคำสั่งย่อของ --only-trailers --only-input --unfold ดังนั้นผลลัพธ์ที่ได้จะเป็นเพียงส่วนของ trailer block เท่านั้น ผลลัพธ์ที่ถูกต้องควรแสดงหนึ่งบรรทัดต่อหนึ่ง trailer หากผลลัพธ์ว่างเปล่าในขณะที่คุณเห็นบรรทัด Co-authored-by: อยู่ชัดเจน แสดงว่า block ดังกล่าวไม่ผ่านกฎการวางตำแหน่งที่ระบุไว้ข้างต้น
หากต้องการสแกนประวัติทั้งหมด ให้ค้นหา trailer ตามคีย์ที่กำหนด
git log --format='%h %(trailers:key=Co-authored-by,valueonly)'git เวอร์ชันเก่าไม่รองรับตัวเลือก key= ในคำสั่ง %(trailers) การค้นหาผ่านข้อความใน commit message สามารถใช้ได้กับทุกเวอร์ชัน
git log -i --grep='^Co-authored-by:' --format='%h %an %s'--grep จะจับคู่กับข้อความใน commit message และ -i จะทำให้การจับคู่ไม่สนใจตัวพิมพ์เล็กหรือใหญ่ ซึ่งมีความสำคัญเนื่องจากการใช้ตัวพิมพ์ใหญ่-เล็กของ trailer นี้ไม่สอดคล้องกันในแต่ละเครื่องมือ ก่อนทำการ push ให้จำกัดขอบเขตการค้นหาเฉพาะสิ่งที่ยังไม่ได้ส่งออกไป
git log origin/main..HEAD --format=%Bcommit เหล่านั้นยังคงอยู่ในเครื่องของคุณ ซึ่งหมายความว่าคุณยังสามารถแก้ไขได้โดยไม่มีผลกระทบมากนัก
Co-authored-by: ส่งผลต่อการระบุตัวตนบน GitHub อย่างไร
GitHub จะอ่านส่วนท้าย (trailer) และแสดงชื่อผู้เขียนคนที่สองในหน้า commit โดยจะเชื่อมโยงผู้เขียนคนดังกล่าวเข้ากับโปรไฟล์ก็ต่อเมื่อที่อยู่อีเมลนั้นเป็นของบัญชีผู้ใช้ใดบัญชีผู้ใช้หนึ่งเท่านั้น เอกสารของ GitHub ระบุว่า commit จะปรากฏบนกราฟการมีส่วนร่วม (contributions graph) ก็ต่อเมื่อ "สร้างขึ้นด้วยที่อยู่อีเมลที่เชื่อมโยงกับบัญชีของคุณบน GitHub" ดังนั้นที่อยู่อีเมลที่ไม่มีเจ้าของจึงไม่สามารถเชื่อมโยงกับโปรไฟล์ใดได้ สำหรับการทำงานเป็นคู่ (pair programming) นี่คือจุดประสงค์หลัก เพราะที่อยู่อีเมลของเพื่อนร่วมงานจะเชื่อมโยงกับบัญชีของเขา และ commit นั้นจะถูกนับรวมให้กับทั้งสองคน สำหรับที่อยู่อีเมลที่ไม่มีบัญชีใดเป็นเจ้าของ ส่วนท้ายนี้จะเปลี่ยนสิ่งที่แสดงบนหน้า commit เท่านั้น แต่จะไม่ส่งผลต่อรายการผู้มีส่วนร่วม (contributor list) ของ repository
ตัว Git เองจะเพิกเฉยต่อส่วนท้ายนี้โดยสิ้นเชิง ทั้ง git shortlog -sn และ git log --author จะอ่านเฉพาะส่วนหัวของผู้เขียน (author header) ซึ่งเก็บชื่อและอีเมลของคุณไว้ ดังนั้นการนับจำนวน commit ในเครื่องจะไม่แสดงชื่อผู้เขียนร่วมแต่อย่างใด การระบุตัวตนในกรณีนี้จึงเป็นฟีเจอร์ของแพลตฟอร์มที่สร้างทับบนธรรมเนียมปฏิบัติแบบข้อความธรรมดา ซึ่งเป็น ความแตกต่างระหว่างตัว Git เองกับแพลตฟอร์มที่คุณโฮสต์มันไว้
ลิงก์ของเซสชันเป็นปัญหาที่ต่างออกไป
ตัวอย่าง (trailer) จะระบุชื่อผู้เขียนร่วม ส่วน URL ของเซสชันคือตัวชี้ไปยังบันทึกการสนทนา (transcript) การตั้งค่าของ Claude Code อ้างอิงถึงเอกสาร attribution.sessionUrl ว่าเป็นคีย์ที่ใช้สำหรับ "ละเว้นลิงก์เซสชัน claude.ai ออกจาก cloud และ Remote Control commits" ซึ่งนั่นยังบอกคุณด้วยว่าลิงก์ดังกล่าวมาจากที่ใด นั่นคือเซสชันบนเว็บและเซสชันที่ดำเนินการผ่าน Remote Control
ลิงก์นี้ไม่ใช่ข้อมูลรับรอง (credential) การที่ใครจะสามารถเปิดเซสชันนั้นได้หรือไม่ ขึ้นอยู่กับการเข้าถึงบัญชีผู้ใช้ ไม่ใช่การเก็บ URL ไว้เป็นความลับ เหตุผลที่ควรเก็บลิงก์นี้ไว้นอก repository สาธารณะนั้นเรียบง่ายกว่า เพราะมันเป็นข้อความสาธารณะถาวรที่ระบุรหัสเซสชันภายใน และชี้ไปยังบันทึกการสนทนาที่ไม่ได้ถูกเขียนขึ้นเพื่อเผยแพร่ต่อสาธารณะ ในทางกลับกัน สำหรับ repository ส่วนตัว ลิงก์นี้มีประโยชน์เพราะผู้ตรวจสอบสามารถติดตามลิงก์เพื่ออ่านที่มาของการเปลี่ยนแปลงได้ สำหรับสถานที่จัดเก็บและระยะเวลาในการคงอยู่ของบันทึกการสนทนาเหล่านั้น สามารถดูได้ที่ วิธีการที่ Claude Code จัดเก็บและเรียกคืนเซสชัน
การตั้งค่าที่ควบคุมการระบุตัวตนในการ commit ของ Claude Code
ข้อมูลนี้ตรวจสอบกับเอกสารอ้างอิงการตั้งค่าของ Claude Code ณ วันที่ 1 กันยายน 2026 โดยคีย์เหล่านี้ถูกระบุไว้ภายใต้หัวข้อ "Git and attribution":
attribution: "ปรับแต่งข้อมูลการระบุตัวตนที่ Claude Code เพิ่มลงใน commit และ pull request"attribution.commit: "เปลี่ยนหรือซ่อนส่วนท้าย (trailer) ที่ Claude Code เพิ่มลงใน commit"attribution.pr: "เปลี่ยนหรือซ่อนบรรทัดระบุตัวตนในคำอธิบายของ pull request"attribution.sessionUrl: "ละเว้นลิงก์เซสชัน claude.ai ออกจาก commit บนคลาวด์และ Remote Control"includeGitInstructions: "ลบคำสั่ง commit และ PR ที่มีมาให้ในตัวออกจาก system prompt"includeCoAuthoredBy: ถูกทำเครื่องหมายว่าเลิกใช้งานแล้ว โดยมีหมายเหตุว่า "ให้ใช้attributionเพื่อซ่อนหรือเปลี่ยนการระบุตัวตนใน commit และ PR"
ให้ใช้ค่าที่แต่ละคีย์รองรับจากรายการของคีย์นั้นๆ ใน เอกสารอ้างอิงการตั้งค่า แทนการดูจากคู่มือ ชื่อคีย์มีความเสถียร แต่ค่าที่ยอมรับและค่าเริ่มต้นอาจมีการเปลี่ยนแปลงได้ หากไฟล์การตั้งค่าสะกดชื่อคีย์ถูกต้องแต่สะกดค่าผิด ระบบจะล้มเหลวโดยไม่แสดงข้อความแจ้งเตือน
ตำแหน่งที่คุณเขียนไฟล์จะเป็นตัวกำหนดว่าใครได้รับผลกระทบ ~/.claude/settings.json มีผลกับทุกโปรเจกต์ที่คุณเปิด ส่วน .claude/settings.json ที่ถูก commit ไว้ที่ระดับบนสุดของ repository จะมีผลกับทุกคนที่ clone โปรเจกต์นั้นไป .claude/settings.local.json เป็นไฟล์ส่วนตัวของคุณในโปรเจกต์นั้นๆ โดย Claude Code จะเพิ่มไฟล์นี้ลงใน global git excludes ของคุณโดยอัตโนมัติในการเขียนไฟล์ครั้งแรก เพื่อไม่ให้ไฟล์นี้ถูกรวมเข้าไปใน commit ของคุณ ลำดับความสำคัญเริ่มจากค่าที่จัดการโดยระบบ ตามด้วย command line, การตั้งค่าระดับโปรเจกต์, การตั้งค่าโปรเจกต์ที่แชร์ไว้ และสุดท้ายคือการตั้งค่าระดับผู้ใช้ ดังนั้นไฟล์ในเครื่องของเพื่อนร่วมทีมจึงมีลำดับความสำคัญสูงกว่าไฟล์ที่คุณ commit ไว้ ให้ถือว่าการตั้งค่าที่ commit ไว้เป็นเพียงค่าเริ่มต้น ไม่ใช่การรับประกัน
จากนั้นให้ตรวจสอบผลลัพธ์ เพราะการตั้งค่าที่คุณเชื่อว่าถูกต้องไม่ใช่หลักฐานยืนยัน ให้ Claude Code ทำการ commit ครั้งถัดไปตามปกติ แล้วตรวจสอบผลลัพธ์ที่ได้
git log -1 --format=%B
git log -1 --format=%B | git interpret-trailers --parseหากส่วนท้าย (trailer) ยังคงแสดงอยู่ แสดงว่าการเปลี่ยนแปลงนั้นยังไม่มีผลกับเซสชัน ให้ตรวจสอบว่าคุณแก้ไขไฟล์ใด และตรวจสอบลำดับความสำคัญข้างต้น ก่อนที่จะสรุปว่าคีย์นั้นใช้งานไม่ได้
การควบคุมที่ไม่ขึ้นอยู่กับการตั้งค่า
การตั้งค่าเป็นการกำหนดค่าให้กับเครื่องมือหนึ่งตัว แต่กฎของ repository ต้องสามารถคงอยู่ได้แม้ในขณะที่ผู้ร่วมพัฒนาใช้เครื่องมืออื่นหรือไม่ได้ใช้ agent เลย Git มีพื้นที่ให้คุณวางกฎดังกล่าวไว้ นั่นคือ hook commit-msg ซึ่งจะทำงานโดยรับ path ของไฟล์ข้อความ commit เป็นอาร์กิวเมนต์แรก และสามารถแก้ไขไฟล์นั้นหรือปฏิเสธการ commit ได้โดยตรง
#!/bin/sh
# .githooks/commit-msg
grep -qi '^co-authored-by: claude' "$1" || exit 0
grep -vi '^co-authored-by: claude' "$1" > "$1.new" && mv "$1.new" "$1"chmod +x .githooks/commit-msg
git config core.hooksPath .githooksgrep ตัวแรกจะจบการทำงานทันทีหากไม่มีสิ่งที่ต้องทำ ดังนั้นการ commit ตามปกติจึงแทบไม่มีภาระเพิ่มเติม ส่วนตัวที่สองจะเขียนข้อความกลับไปโดยไม่มีบรรทัดที่ตรงกับเงื่อนไข ให้เลือกจับคู่ token ที่แน่นอนแทนการจับคู่ trailer ทั้งหมด เพราะตัวกรองที่เขียนว่า "ลบบล็อกสุดท้ายทิ้ง" จะลบเอาบรรทัด Signed-off-by: ที่โปรเจกต์จำเป็นต้องใช้ออกไปด้วย
.git/hooks ไม่ได้เป็นส่วนหนึ่งของ repository ดังนั้น hook ที่คุณวางไว้ในนั้นจะไม่มีวันส่งต่อไปยังผู้อื่น core.hooksPath จะชี้ Git ไปยังไดเรกทอรีที่คุณสามารถ commit ได้ และแต่ละคนยังคงต้องรันคำสั่ง git config นั้นด้วยตนเอง Git จะไม่ตั้งค่านี้ให้โดยอัตโนมัติ ซึ่งเป็นความตั้งใจในการออกแบบ เพราะ repository ที่สามารถติดตั้งไฟล์สั่งการ (executable) ของตัวเองได้ทันทีที่ clone จะกลายเป็นช่องทางในการรันโค้ดบนเครื่องของคุณ
หากต้องการปฏิเสธการ commit แทนการแก้ไขข้อความ ให้พิมพ์ข้อความไปยัง standard error และ exit 1 ออกจาก hook การปฏิเสธเป็นทางเลือกที่ตรงไปตรงมาสำหรับ repository ที่ใช้ร่วมกัน เนื่องจากหากแก้ไขข้อความ commit ของผู้อื่นโดยไม่แจ้งให้ทราบ จะเป็นการปกปิดกฎแทนที่จะเป็นการสอนให้ผู้ใช้ทราบถึงกฎนั้น นี่เป็นคนละชั้นกับการทำงานของ hook ของตัว agent เอง ซึ่งจะทำงานเมื่อมีการเรียกใช้เครื่องมือ (tool call) ก่อนที่ Git จะเข้ามาเกี่ยวข้อง และ วิธีที่ hook ของ Claude Code จับคู่เครื่องมือและบล็อกการทำงาน จะครอบคลุมในส่วนนั้น
ทั้งสองวิธีข้างต้นไม่สามารถช่วยจัดการกับ pull request จาก fork ได้ เนื่องจาก hook ดังกล่าวอยู่ในเครื่องที่คุณไม่สามารถควบคุมได้ การตรวจสอบใน CI (continuous integration) จึงเป็นชั้นเดียวที่สามารถเห็นทุก commit ก่อนที่จะมีการ merge
if git log --format=%B "origin/${BASE_BRANCH:-main}..HEAD" | grep -qi '^co-authored-by: claude'; then
echo "Attribution trailer found. Rewrite the branch before merging." >&2
exit 1
fiจงเขียนกฎระเบียบไว้เป็นลายลักษณ์อักษรควบคู่ไปกับการบังคับใช้ ไฟล์ AGENTS.md ที่วางอยู่ข้างไฟล์ CONTRIBUTING.md สำหรับมนุษย์ จะช่วยบอกทั้ง agent และบุคคลทั่วไปให้เข้าใจตรงกัน และการตรวจสอบผ่าน CI คือสิ่งที่ทำให้กฎนั้นเป็นจริง
การลบ trailer ก่อนที่คุณจะ push
สำหรับ commit ที่คุณเพิ่งทำไป:
git log -1 --format=%B | grep -vi '^co-authored-by: claude' | git commit --amend -F --F - จะอ่านข้อความใหม่จาก standard input โดย Git จะตัดบรรทัดว่างที่อยู่ส่วนต้นและส่วนท้ายของข้อความที่ป้อนด้วยวิธีนี้ออก ดังนั้นบรรทัดว่างที่เหลือจากการลบ trailer จะหายไปเองโดยอัตโนมัติ ให้ตรวจสอบผลลัพธ์ด้วย git log -1 --format=%B ก่อนดำเนินการต่อ
สำหรับหลาย commit บน branch ให้ทำ interactive rebase เทียบกับ branch ที่คุณจะ merge เข้าไป และทำเครื่องหมายแต่ละข้อความที่คุณต้องการแก้ไขเป็น reword
git rebase -i origin/mainทุก commit ตั้งแต่ commit แรกที่ถูกแก้ไขเป็นต้นไปจะได้ hash ใหม่ เนื่องจาก hash ของ commit ครอบคลุมถึงข้อความและ parent ของมัน การดำเนินการนี้ไม่มีค่าใช้จ่ายหาก commit ยังอยู่แค่ในเครื่อง แต่จะมีค่าใช้จ่ายสูงเมื่อ commit เหล่านั้นถูก push ออกไปแล้ว
การลบ trailer หลังจากที่คุณ push ไปแล้ว
บน branch ที่คุณใช้งานเพียงคนเดียว ให้เขียนประวัติใหม่ตามวิธีการข้างต้นแล้วจึง push ทับลงไป
git push --force-with-lease--force-with-lease จะปฏิเสธการ push หากฝั่ง remote มีการเปลี่ยนแปลงนับตั้งแต่การ fetch ครั้งล่าสุดของคุณ เพื่อป้องกันไม่ให้มีการลบ commit ที่ผู้อื่นเพิ่มเข้ามาโดยไม่ตั้งใจ ส่วนคำสั่ง --force แบบปกติจะไม่มีการตรวจสอบในลักษณะนี้
สำหรับการแก้ไข trailer ที่กระจายตัวอยู่ในประวัติการทำงานที่ยาวนาน git filter-repo จะเขียนข้อความ commit ใหม่ทั้งหมดในคราวเดียว ให้รันคำสั่ง clone จากภายใน working copy ที่คุณมีอยู่ เพื่อให้ URL ดึงมาจาก remote ที่คุณใช้งานอยู่แล้ว
pip install git-filter-repo
git clone "$(git remote get-url origin)" ../project-rewrite
cd ../project-rewrite
git filter-repo --message-callback '
return b"\n".join(l for l in message.split(b"\n") if not l.lower().startswith(b"co-authored-by: claude"))
'callback จะได้รับข้อความแต่ละรายการในรูปแบบ bytes และส่งคืนข้อความเพื่อนำไปจัดเก็บ นี่คือเหตุผลที่ทุกสตริงในนั้นจะมี prefix เป็น b คำสั่ง filter-repo จะปฏิเสธการทำงานบน repository ที่ไม่ใช่การ clone มาใหม่ เว้นแต่คุณจะระบุ flag --force และมันจะลบ remote origin ออกเมื่อทำงานเสร็จสิ้น เพื่อป้องกันไม่ให้คุณเผลอ push ประวัติที่เขียนใหม่กลับไปโดยไม่ตั้งใจ หากต้องการ push ให้เพิ่ม remote กลับเข้าไปใหม่ด้วยความตั้งใจ จากนั้นจึง force-push และแจ้งให้ทุกคนทำการ clone ใหม่ เนื่องจาก hash ทุกตัวที่พวกเขาถืออยู่จะไม่ถูกต้องอีกต่อไป
ต้องเข้าใจให้ชัดเจนว่าการเขียนประวัติใหม่ทำอะไรไม่ได้บ้าง มันจะเปลี่ยนแปลงเฉพาะสำเนา repository ของคุณเท่านั้น มันไม่สามารถเข้าถึง fork, clone ที่มีอยู่เดิม, mirror, หน้า pull request ที่อ้างอิงข้อความนั้นไปแล้ว หรือดัชนีการค้นหาโค้ดที่เข้ามา crawl ข้อมูลของคุณเมื่อสัปดาห์ก่อนได้ สำหรับกรณีข้อมูลลับรั่วไหล วิธีแก้ไขคือการหมุนเวียน (rotate) ข้อมูลลับนั้น ส่วนการเขียนประวัติใหม่เป็นเพียงการทำความสะอาดข้อมูลเท่านั้น trailer ที่เปิดเผยข้อมูลไม่ใช่ข้อมูลลับ ดังนั้นควรชั่งน้ำหนักระหว่างการเขียนประวัติใหม่ทั้งระบบกับผลกระทบที่ตามมา ซึ่งก็คือการที่ pull request ที่เปิดค้างไว้อยู่ทั้งหมดจะต้องถูกสร้างขึ้นใหม่
สิ่งที่ผู้ตรวจสอบในอีกฝั่งคาดหวัง
ผู้ดูแลโครงการมีความเห็นไม่ตรงกันในเรื่องนี้ และความเห็นที่ไม่ตรงกันนี้คือเหตุผลที่แท้จริงว่าทำไมคุณควรตรวจสอบก่อนที่จะลบข้อมูลใดๆ ออกไป บางโครงการต้องการการเปิดเผยข้อมูลและจะขอให้คุณใส่กลับเข้าไป เพราะผู้ตรวจสอบจะอ่าน patch ที่เขียนโดยเครื่องด้วยมุมมองที่ต่างออกไป บางโครงการสั่งห้ามทำเช่นนั้น โดยมักเป็นประเด็นเรื่องว่าใครเป็นผู้เขียนการเปลี่ยนแปลงนั้นตามกฎหมาย โครงการที่ใช้ DCO (developer certificate of origin) จะกำหนดให้มีบรรทัด Signed-off-by: ซึ่งเป็นคำยืนยันเกี่ยวกับสิทธิ์ของคุณในการส่งโค้ด และตัวกรองข้อความที่ขาดความระมัดระวังอาจลบส่วนนี้ออกไปพร้อมกับการระบุตัวตนผู้เขียน
โปรดอ่าน CONTRIBUTING.md ก่อน หากโครงการไม่ได้ระบุอะไรไว้ ให้เลือกกฎหนึ่งข้อสำหรับ repository นั้นแล้วจดบันทึกไว้ เพราะการมีส่วนท้าย (trailer) ปรากฏอยู่เพียงครึ่งหนึ่งของ commit นั้นแย่ยิ่งกว่าการเลือกทางใดทางหนึ่ง เพราะมันทำให้ประวัติการทำงานดูเหมือนมาจากสองโครงการ
หากคุณรัน agent บนเซิร์ฟเวอร์แทนที่จะเป็นแล็ปท็อปของคุณ คำถามเดิมจะย้อนกลับมาในอีกระดับหนึ่ง การรัน Claude Code บน VPS ภายใต้บัญชีของตนเอง จะเป็นตัวตัดสินว่ามันสามารถเข้าถึง repository ใดได้บ้าง และ สิ่งที่ coding agent ส่งออกจากเครื่อง จะครอบคลุมถึง traffic ที่ไม่เคยปรากฏอยู่ในข้อความ commit
FAQ
Co-authored-by trailer สำหรับ Claude นับรวมในสถิติผู้มีส่วนร่วมของ repository หรือไม่?
ไม่นับ GitHub จะเชื่อมโยง commit เข้ากับโปรไฟล์ผ่านที่อยู่อีเมลที่ผูกกับบัญชี GitHub และนับจำนวนการมีส่วนร่วมจากข้อมูลนั้น ที่อยู่อีเมลที่ไม่ได้ผูกกับบัญชีใดจะไม่สามารถเชื่อมโยงได้ ดังนั้น trailer จึงเปลี่ยนหน้า commit แต่ไม่ส่งผลต่อรายการผู้มีส่วนร่วม ตัว Git เองไม่ได้อ่านค่าจาก trailer เพื่อจุดประสงค์นี้ git shortlog -sn จะนับเฉพาะส่วนหัวของผู้เขียน (author header) ดังนั้น co-author จึงไม่ปรากฏในรายการดังกล่าว
ฉันจะค้นหาทุก commit ที่มี trailer นี้อยู่ได้อย่างไร?
git log -i --grep='^Co-authored-by:' --format='%h %an %s' จะแสดงรายการทั้งหมดตลอดประวัติการทำงานโดยไม่คำนึงถึงตัวพิมพ์เล็กหรือใหญ่ ใน Git เวอร์ชันใหม่ git log --format='%h %(trailers:key=Co-authored-by,valueonly)' จะอ่านค่าผ่านตัวแยกวิเคราะห์ trailer ของ Git เองแทนการจับคู่ข้อความดิบ หากต้องการดูเฉพาะ commit ที่ยังไม่ได้ push ให้เพิ่มช่วงเวลา: git log origin/main..HEAD --format=%B
ฉันสามารถลบ trailer ออกจาก commit ที่ push ไปแล้วได้หรือไม่?
ได้ โดยการเขียนประวัติใหม่ (rewriting history) แต่มีผลกระทบที่ต้องพิจารณา หากเป็น branch ที่คุณใช้คนเดียว ให้ใช้การ amend หรือ rebase แล้วตามด้วย git push --force-with-lease แต่หากเป็น branch ที่ใช้ร่วมกัน ทุก commit ตั้งแต่จุดที่แก้ไขจะเปลี่ยน hash ใหม่ทั้งหมด ทำให้ทุก clone และทุก pull request ที่เปิดอยู่ต้องถูกสร้างใหม่ นอกจากนี้ การเขียนประวัติใหม่จะไม่ส่งผลต่อ fork, mirror หรือ clone ที่ผู้อื่นทำไปก่อนหน้านี้
ลิงก์เซสชัน claude.ai ในข้อความ commit ถือเป็นความเสี่ยงด้านความปลอดภัยหรือไม่?
ลิงก์ดังกล่าวไม่ใช่ credential และการเข้าถึงเซสชันจะถูกตัดสินจากบัญชีผู้ใช้ ไม่ใช่จากการที่ URL คาดเดาได้ยาก ปัญหาคือมันเป็นข้อความสาธารณะถาวรที่ชี้ไปยังบันทึกการทำงาน เอกสารอ้างอิงการตั้งค่า Claude Code ระบุว่า attribution.sessionUrl คือคีย์ที่ใช้ละเว้นลิงก์ดังกล่าวจาก commit บน cloud และ Remote Control และสามารถใช้ commit-msg hook เพื่อลบลิงก์ออกในกรณีที่การตั้งค่าปกติครอบคลุมไม่ถึง
ฉันควรปิดการระบุแหล่งที่มา (attribution) หรือไม่?
ขึ้นอยู่กับนโยบายของ repository นั้นๆ ไม่ใช่ความชอบส่วนบุคคล สำหรับโปรเจกต์สาธารณะ ให้ปฏิบัติตาม CONTRIBUTING.md เนื่องจากผู้ดูแลโปรเจกต์ที่ต้องการข้อมูลการเปิดเผยแหล่งที่มาจะร้องขอให้คุณใส่กลับเข้าไป สำหรับ repository ของบริษัท การเก็บ trailer ไว้มักจะมีประโยชน์ เพราะช่วยให้ผู้ตรวจสอบงานในอีกหนึ่งปีข้างหน้าเข้าใจที่มาของการเปลี่ยนแปลงนั้นๆ ควรตัดสินใจให้ชัดเจนสำหรับทั้ง repository และบังคับใช้ผ่าน CI เพื่อให้ประวัติการทำงานมีความสอดคล้องกัน