เป็นไปได้หรือไม่ที่จะมีการกำหนดค่า Git ที่แตกต่างกันสำหรับโครงการต่างๆ


315

.gitconfigมักจะเก็บไว้ในuser.homeไดเรกทอรี

ฉันใช้ข้อมูลระบุตัวตนที่แตกต่างกันในการทำงานกับโครงการสำหรับ บริษัท A และอย่างอื่นสำหรับ บริษัท B (โดยหลักคือชื่อ / อีเมล) ฉันจะมีการกำหนดค่า Git ต่างกันสองวิธีเพื่อให้การเช็คอินของฉันไม่ไปกับชื่อ / อีเมล

คำตอบ:


264

.git/configแฟ้มในโคลนด้านการเก็บข้อมูลเป็นท้องถิ่นที่จะโคลนนิ่งว่า การตั้งค่าใด ๆ ที่วางไว้ที่นั่นจะมีผลกับการกระทำของโครงการนั้นเท่านั้น

(โดยค่าเริ่มต้นgit configจะปรับเปลี่ยน.git/configไม่~/.gitconfigเพียง แต่--globalจะแก้ไขหลังเท่านั้น)


ดังนั้นจะแก้ไขไฟล์ config ในการกำหนดค่าสำหรับ repo เองเช่นการเปลี่ยน[user] email = ...บล็อคจะแทนที่ทั่วโลก~/.gitconfig- และนี่เป็นเพียงสำหรับผู้ใช้ของคุณ?
dcsan

283

การกำหนดค่า git มี 3 ระดับ; โครงการระดับโลกและระบบ

  • โครงการ : การกำหนดค่าโครงการจะใช้ได้เฉพาะกับโครงการปัจจุบันและเก็บไว้ใน. git / config ในไดเรกทอรีของโครงการ
  • global : การกำหนดค่าระดับโลกพร้อมใช้งานสำหรับโครงการทั้งหมดสำหรับผู้ใช้ปัจจุบันและเก็บไว้ใน ~ / .gitconfig
  • ระบบ : การกำหนดค่าระบบพร้อมใช้งานสำหรับผู้ใช้ / โครงการทั้งหมดและเก็บไว้ใน / etc / gitconfig

สร้างการกำหนดค่าเฉพาะโครงการคุณจะต้องดำเนินการนี้ภายใต้ไดเรกทอรีของโครงการ:

$ git config user.name "John Doe" 

สร้างการกำหนดค่าทั่วโลก:

$ git config --global user.name "John Doe"

สร้างการกำหนดค่าระบบ:

$ git config --system user.name "John Doe" 

และอย่างที่คุณอาจเดาได้ว่าโครงการจะแทนที่ระบบการแทนที่ทั่วโลกและทั่วโลก


69
มีความเป็นไปได้ที่จะสร้างบางส่วน "ไดเรกทอรี" config? ฉันทำงานที่บ้านและรับโฟลเดอร์ที่มีโปรเจ็กต์งานและของฉันเอง ดังนั้นฉันจึงมีโฟลเดอร์ ~ / job และ ~ / my ด้วย repos git และต้องการ configs ที่แตกต่างกันสำหรับโครงการภายใต้พวกเขา เช่น job / project1 มี config จาก job / .gitconfig
Serge

2
@Serge คุณเคยคิดไหมว่าเป็นไปได้ที่จะสร้างการกำหนดค่าระดับไดเรกทอรีหรือไม่ ฉันมีปัญหาเดียวกันในขณะนี้
ตั้งคำถาม

2
ไม่ฉันตั้งค่าระบบโดยรวมเป็นข้อมูลส่วนบุคคลและสร้าง bash script เพื่อตั้งค่าข้อมูลงานเป็นค่ากำหนดโครงการบางอย่างในคำสั่งเดียว
Serge

1
ในฐานะที่เป็นภาคผนวก: เพียงgit config user.nameหรือgit config user.emailจะแสดงชื่อหรืออีเมล Git ที่จะใช้สำหรับพื้นที่เก็บข้อมูลปัจจุบัน
Abhishek Divekar

1
ฉันลงเอยด้วยการทำสิ่งนี้เพื่อ zsh : gist.github.com/pgarciacamou/3b67320e2940c8d7fa3d7bbd73873106ฉันหวังว่านี่จะช่วยใครซักคน
pgarciacamou

219

ขณะที่รุ่นคอมไพล์ 2.13, คอมไพล์สนับสนุนการกำหนดค่าเงื่อนไขรวมถึง ในตัวอย่างนี้เราโคลน Repos บริษัท ใน~/company_aไดเรกทอรีและ Repos บริษัท ~/company_bบีใน

ในตัวคุณ.gitconfigคุณสามารถใส่อะไรแบบนี้

[includeIf "gitdir:~/company_a/"]
  path = .gitconfig-company_a
[includeIf "gitdir:~/company_b/"]
  path = .gitconfig-company_b

ตัวอย่างเนื้อหาของ. gitconfig-company_a

[user]
name = John Smith
email = john.smith@companya.net

ตัวอย่างเนื้อหาของ. gitconfig-company_b

[user]
name = John Smith
email = js@companyb.com

1
เป็นเรื่องดีที่ได้เห็นสิ่งนี้ได้รับการเพิ่มในเวอร์ชั่น 2.13 ฉันใช้github.com/bddenhartog/git-profilesมานานแล้ว แต่ไม่สามารถใช้งานกับ Tower ได้
adrum

4
รวมถึงหากเป็นจู้จี้จุกจิกเล็กน้อยโปรดดู: stackoverflow.com/questions/43919191/ …
ruble

หน้าเอกสารที่คุณเชื่อมโยงไม่ได้พูดถึงเรื่องนี้ ... อันที่จริงแล้วการค้นหา includeIf ไม่ได้ให้ผลลัพธ์ใด ๆ ในเอกสาร
Thomas Levesque

1
@ThomasLevesque นั่นแปลก ฉันแน่ใจว่ามันพูดอะไรบางอย่างเกี่ยวกับเรื่องนี้มาก่อน คุณสามารถค้นหาได้ใน changelog github.com/git/git/blob/master/Documentation/RelNotes/ …และไปที่kernel.org/pub/software/scm/git/docs/git-config.html
crea1

2
@JosephLust คุณต้องติดตั้งคอมไพล์> = 2.13 (Ubuntu 16.04 มีคอมไพล์ 2.7) รับ git เวอร์ชันล่าสุดผ่านGit PPAและมันจะทำงาน :)
Cas

24

ขอบคุณ @ crea1

ตัวแปรเล็ก ๆ :

ตามที่เขียนไว้ในhttps://git-scm.com/docs/git-config#_includes :

หากรูปแบบลงท้ายด้วย/, **จะถูกเพิ่มโดยอัตโนมัติ ตัวอย่างเช่นรูปแบบจะกลายเป็นfoo/ foo/**กล่าวอีกนัยหนึ่งมันจับคู่fooและทุกอย่างภายใน

ดังนั้นฉันใช้ในกรณีของฉัน
~ / .gitconfig :

[user] # as default, personal needs
    email = myalias@personal-domain.fr
    name = bcag2
[includeIf "gitdir:~/workspace/"] # job needs, like workspace/* so all included projects
    path = .gitconfig-job

# all others section: core, alias, log…

ดังนั้นหากไดเรกทอรีโครงการเป็นของฉัน~/wokspace/การตั้งค่าผู้ใช้เริ่มต้นจะถูกแทนที่ด้วย
~ / .gitconfig-w :

[user]
name = John Smith
email = js@company.com

ทำสิ่งนี้ตอนนี้ชื่อผู้ใช้และอีเมลที่ถูกต้องจะถูกตั้งค่าในไดเรกทอรีต่าง เมื่อฉันทำ git config user.name / git config user.email ฉันจะได้รับรายละเอียดที่ถูกต้อง แต่เมื่อฉันแสดงความคิดเห็นใน repo ส่วนบุคคลมันจะรับอีเมลชื่อผู้ใช้อย่างเป็นทางการระดับโลกเสมอ
Bhupendra

@Bhupendra ในตัวอย่างของฉัน. gitconfig และ. gitconfig-job อยู่ในบ้านของฉันไม่ใช่ในไดเรกทอรีโครงการ คุณต้องการมากกว่าสองหรือไม่? คุณสร้าง. gitconfig-alternativ ในโฮมไดเร็กตอรี่ของคุณเป็น. gitconfig-job ในตัวอย่างของฉัน, มี 3 บรรทัด.
bcag2

@ bcag2 ฉันก็ทำตามตัวอย่างเดียวกันที่ได้รับด้านบน ฉันมี 2 configs ทำงานค่าเริ่มต้นและส่วนบุคคลคล้ายกับ gitconfig-job เมื่อฉันอยู่ในไดเรกทอรีส่วนบุคคลบน git config user.name ให้ชื่อที่ถูกต้องกับฉัน แต่สำหรับการส่งการส่งข้อมูลจะใช้ค่าเริ่มต้นในขณะที่ฉันต้องการชื่อส่วนบุคคล
swapnil2993

@ swapnil2993 แรกฉันคิดว่าที่ปัญหาเส้นทาง แต่ถ้าgit config user.nameกลับถูกต้องมันควรจะโอเค คุณอยู่ภายใต้ GNU / Linux หรือระบบปฏิบัติการอื่น ๆ
bcag2

@ bcag2 แก้ไขปัญหาแล้ว เพิ่งแก้ไขเส้นทาง แต่ git config user.name ที่ส่งคืนค่าที่ถูกต้องนั้นแปลก ขอบคุณสำหรับคำตอบ.
swapnil2993

14

หากต้องการระบุชัดเจนคุณสามารถใช้--localเพื่อใช้ไฟล์กำหนดค่าที่เก็บปัจจุบัน :

git config --local user.name "John Doe" 

12

คุณยังสามารถชี้ตัวแปรสภาพแวดล้อมGIT_CONFIGไปยังไฟล์ที่git configควรใช้ ด้วยGIT_CONFIG=~/.gitconfig-A git config key valueไฟล์ที่ระบุได้รับการจัดการ


2
เย็น; ด้วยเวทย์มนตร์กระสุนที่ฉลาดนี้สามารถใช้เพื่อสร้างสิ่งต่าง ๆ ขึ้นดังนั้น git จึงเลือก. gitconfig ตัวแรกที่พบเมื่อสำรวจต้นไม้ dir ที่อยู่เหนือ repo ปัจจุบัน ขอบคุณ!
ecmanaut

1
คุณมีลิงค์ไปยังเวทย์มนตร์เชลล์ที่ทำสิ่งนี้หรือไม่? ฟังดูมีประโยชน์!
pchiusano

1
@pchiusano นี่เป็นรุ่นพื้นฐานของมันในปลาgithub.com/CtrlC-Root/dotfiles/blob/master/.config/fish/...
ctrlc ราก

ขอบคุณสำหรับคำตอบง่ายๆที่ต้องเปลี่ยนตัวแปรสภาพแวดล้อมเดียว
Noah Sussman

จะส่งผลต่อคำสั่ง git config เท่านั้นตอนนี้github.com/git/git/blob/master/Documentation/RelNotes/…
foray1010

12

ฉันกำลังทำสิ่งนี้สำหรับอีเมลของฉันด้วยวิธีต่อไปนี้:

git config --global alias.hobbyprofile 'config user.email "me@example.com"'

จากนั้นเมื่อฉันโคลนโครงการงานใหม่ฉันต้องทำงานเท่านั้นgit hobbyprofileและจะถูกกำหนดค่าให้ใช้อีเมลนั้น


3

อีกวิธีหนึ่งคือการใช้direnvและเพื่อแยกไฟล์กำหนดค่าต่อไดเรกทอรี ตัวอย่างเช่น:

.
├── companyA
│  ├── .envrc
│  └── .gitconfig
├── companyB
│  ├── .envrc
│  └── .gitconfig
└── personal
   ├── .envrc
   └── .gitconfig

แต่ละคน.envrcควรมีสิ่งนี้:

export GIT_CONFIG=$(pwd)/.gitconfig

และ.gitconfigเป็น gitconfig ปกติพร้อมค่าที่ต้องการ


2

คุณสามารถปรับแต่งการกำหนดค่า Git ของโครงการได้โดยเปลี่ยนไฟล์การกำหนดค่าเฉพาะของที่เก็บ (เช่น/path/to/repo/.git/config) BTW git configเขียนลงไฟล์นี้เป็นค่าเริ่มต้น:

cd /path/to/repo
git config user.name 'John Doe'  # sets user.name locally for the repo

ฉันชอบสร้างโปรไฟล์แยกต่างหากสำหรับโครงการต่างๆ (เช่นใน~/.gitconfig.d/) จากนั้นรวมไว้ในไฟล์กำหนดค่าของที่เก็บ:

cd /path/to/repo
git config include.path '~/.gitconfig.d/myproject.conf'

วิธีนี้ใช้งานได้ดีหากคุณต้องการใช้ชุดตัวเลือกเดียวกันในหลาย repos ที่เป็นของโครงการเดียว คุณยังสามารถตั้งค่านามแฝงของเชลล์หรือคำสั่ง Git ที่กำหนดเองเพื่อจัดการโปรไฟล์


0

ฉันอยู่ในเรือลำเดียวกัน ฉันเขียนสคริปต์ทุบตีเล็กน้อยเพื่อจัดการพวกเขา https://github.com/thejeffreystone/setgit

#!/bin/bash

# setgit
#
# Script to manage multiple global gitconfigs
# 
# To save your current .gitconfig to .gitconfig-this just run:
# setgit -s this
#
# To load .gitconfig-this to .gitconfig it run:
# setgit -f this
# 
# 
# 
# Author: Jeffrey Stone <thejeffreystone@gmail.com>

usage(){
  echo "$(basename $0) [-h] [-f name]" 
  echo ""
  echo "where:"
  echo " -h  Show Help Text"
  echo " -f  Load the .gitconfig file based on option passed"
  echo ""
  exit 1  
}

if [ $# -lt 1 ]
then
  usage
  exit
fi

while getopts ':hf:' option; do
  case "$option" in
      h) usage
         exit
         ;;
      f) echo "Loading .gitconfig from .gitconfig-$OPTARG"
         cat ~/.gitconfig-$OPTARG > ~/.gitconfig
         ;;
      *) printf "illegal option: '%s'\n" "$OPTARG" >&2
         echo "$usage" >&2
         exit 1
         ;;
    esac
done

สคริปต์ของคุณที่นี่อยู่ใน Bash ในขณะที่ Github คุณมีเวอร์ชัน Python ยัง-sไม่ได้รับการจัดการในสคริปต์ Bash ของคุณ
Vadim Kotov

0

ฉันมีข้อผิดพลาดเมื่อพยายามgit stashเปลี่ยนแปลงท้องถิ่นของฉัน ข้อผิดพลาดจากคอมไพล์กล่าวว่า "โปรดบอกฉันว่าคุณเป็นใคร" แล้วบอกให้ฉัน "เรียกใช้git config --global user.email "you@example.comและgit config --global user.name "Your name"ตั้งค่าตัวตนเริ่มต้นของบัญชีของคุณ" อย่างไรก็ตามคุณต้องOmit --globalเพื่อตั้งค่า identity ในที่เก็บปัจจุบันของคุณเท่านั้น

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