การกำหนดค่า git สามารถตั้งค่าได้หลายที่เก็บหรือไม่?


18

Git ดูเหมือนว่าจะสนับสนุนค่าการกำหนดค่าที่สามระดับ:

  • การตั้งค่าส่วนกลางต่อระบบ (เก็บไว้ใน/etc/git-core)
  • การตั้งค่าส่วนกลางต่อผู้ใช้ (เก็บไว้ใน~/.gitconfig)
  • การตั้งค่าโลคัลต่อที่เก็บ (เก็บไว้ใน$REPO/.git/config)

ตัวเลือกเหล่านี้ครอบคลุมพื้นฐานเกือบทั้งหมด แต่ฉันกำลังมองหาวิธีจัดการกับระดับที่สี่ ฉันมีคอลเลกชันขนาดใหญ่มากซึ่งฉันต้องใช้ค่าที่แตกต่างuser.emailจากปกติ ที่เก็บเหล่านี้มักจะถูกสร้างและจัดการผ่านสคริปต์อัตโนมัติและการตั้งค่าต่อการตั้งค่าท้องถิ่นของที่เก็บนั้นยุ่งยาก

ที่เก็บทั้งหมดที่เป็นปัญหาอยู่ภายใต้คำนำหน้าเส้นทางที่แน่นอนในระบบท้องถิ่นของฉัน มีวิธีการตั้งค่าการกำหนดค่าบางที่จะได้รับมรดกโดยที่เก็บทั้งหมดภายใต้เส้นทางนั้นหรือไม่? (การเรียงลำดับของ.htaccessการตั้งค่าที่ชอบสืบทอดมาจนถึงระบบไฟล์) บางทีอาจมีวิธีตั้งค่าตามเงื่อนไขในไฟล์กำหนดค่าส่วนกลางหรือไม่ การเตรียมการอื่น ๆ ที่สามารถทำในสภาพแวดล้อม UNIX เพื่อรับมือกับชุดของที่เก็บเช่นฉัน?


รีเฟล็กซ์แรกของฉันคือแฮ็คสคริปต์เพื่อปรับแต่ง.gitconfigในแต่ละไดเรกทอรีที่สร้าง ตัวอย่างเช่นrepoของ IIRC Android สามารถทำสิ่งนี้ได้ แต่คุณต้องอ่านแหล่งข้อมูลอย่างละเอียดเพื่อหาคำตอบ (ฉันไม่แน่ใจอย่างสมบูรณ์ฉันไม่ได้ทำอย่างนั้นสักครู่)
Gilles 'ดังนั้นหยุดความชั่วร้าย'

@Gilles: นั่นเป็นโอกาสที่แน่นอน repos ที่เป็นปัญหาคือที่เก็บแพ็กเกจสำหรับ Linux distro ที่เพิ่งย้ายจาก CVS เป็น Git เรายังคงทำงานเกี่ยวกับการทำซ้ำเครื่องมือทั้งหมดของเรา ในระยะยาวอาจเป็นที่ที่สิ่งนี้ได้รับการแก้ไข แต่ในระยะสั้นพวกเราที่กำลังทำอยู่นั้นกำลังทดลองกับตัวเลือกต่างๆ
Caleb

คำตอบ:


11

ฉันไม่พบวิธีกำหนดค่า git ในระดับที่สี่นี้ git -c key=valueวิธีเดียวที่ดูเหมือนว่าจะมีต่อคำสั่งแทนที่ค่าการกำหนดค่าการใช้

โซลูชันแฮ็คปัจจุบันของฉันคือการกำหนดฟังก์ชันเชลล์ที่ทำหน้าที่เป็น wrapper สำหรับ git เมื่อเรียกใช้มันจะส่งผ่านอาร์กิวเมนต์ไปยังคำสั่ง system git แต่จะไม่ตรวจสอบบนไดเร็กทอรีการทำงานปัจจุบันและเพิ่มอาร์กิวเมนต์พิเศษลงในคำสั่งหากทำได้

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c user.email=alternate@credentials.org "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}

ฉันจะทำcommand git -c user.email=alternate@credentials.org user.name="Alter Ego" "$@"หรือฉันควรทำอย่างไร ค้นหาสูง & ต่ำและการอ้างอิงเดียวกับแฟล็ก -c นี้ที่ฉันพบว่าเป็นของคุณขอบคุณมาก
Vic Goldfeld

สำหรับบันทึกฉันได้รับมันทำงานด้วยcommand git -c user.email=alternate@credentials.org -c user.name="Alter Ego" "$@"
Vic Goldfeld

6

GIT_AUTHOR_EMAILคุณสามารถกำหนดค่าที่อยู่อีเมลสำหรับคอมไพล์กับตัวแปรสภาพแวดล้อม หากคุณรวมสิ่งนี้กับExecute สคริปต์ทุบตีในการเข้าสู่ไดเรกทอรีหรือการกำหนดค่าเปลือกไดเรกทอรีเฉพาะกับ zshคุณสามารถเปลี่ยนการตั้งค่าต่อไดเรกทอรีหรือไดเรกทอรีหลักเช่นถ้าคุณเข้าสู่ไดเรกทอรีใน~/workคุณสามารถปรับตัวแปรสภาพแวดล้อมเพื่อเปลี่ยนอีเมลของคุณโดยอัตโนมัติ ที่อยู่


2

ดูวิธีการแก้ปัญหาตามการกำหนดค่า git:

http://gik.firetrot.com/index.php/2018/05/06/git-configuration-across-multiple-repositories/

เพิ่มลงในไฟล์“ ~ / .gitconfig”:

    [includeIf "gitdir:~/work/project1/.git"]  
      path = .gitconfig-project1  

สร้างไฟล์“ ~ / .gitconfig-project1″ ที่มีเนื้อหา:

    [core]  
      sshCommand = "ssh -i ~/.ssh/project1 -F /dev/null"  

    [user]  
      name = user1  
      email = user1@email.com  

"includeIf" ภาคแสดงช่วยประหยัดอาการปวดหัวของฉัน!
Truong Nguyen

1

ขึ้นอยู่กับคำตอบของ Caleb เราสามารถกำหนดgitคำสั่งที่แก้ไขซึ่งกำหนดค่าที่เก็บทั้งหมดในไดเรกทอรีนี้อย่างถูกต้องอย่างถาวรเพื่อให้การใช้วานิลลา git ในอนาคตทั้งหมดจะใช้การกำหนดค่าใหม่ ฉันใช้hubซึ่งเป็น wrapper git อื่นดังนั้นฉันแทนที่ของฉันalias git=hubด้วยสิ่งนี้และเรียกว่าhubในฟังก์ชั่นของฉัน - ถ้าคุณไม่ได้ใช้hubให้เปลี่ยนhubการเรียกใช้ทั้งหมดด้วยcommand git:

function git() {
    case "$PWD" in
        /home/robin/git/3RD_PARTY)
            hub "$@"
            # We don't know which repository was cloned / operated on, so let's just reconfigure them all
            for f in *; do
                [[ -d "$f" ]] && hub -C "$f" config user.email $my_private_email
            done
            ;;
        /home/robin/git/3RD_PARTY/*)
            hub "$@"
            hub config user.email $my_private_email
            ;;
        *)
            hub "$@"
            ;;
    esac
}

ซึ่งแตกต่างจากคำตอบของ Caleb ซึ่งใช้งานได้ในเชลล์เท่านั้น (และยกเว้นกรณีที่มีแหล่งที่มาอย่างชัดเจนเฉพาะในเชลล์แบบโต้ตอบ) สิ่งนี้ยังส่งผลกระทบต่อส่วนหน้าอื่น ๆ ของ Git ซึ่งอ่านค่า git ได้อย่างถูกต้องเช่น

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