จะบอกให้คอมไพล์ใช้ข้อมูลประจำตัวที่ถูกต้อง (ชื่อและอีเมล) สำหรับโครงการที่กำหนดได้อย่างไร


117

ฉันใช้แล็ปท็อปส่วนตัวสำหรับทั้งงานและโครงการส่วนตัวและฉันต้องการใช้ที่อยู่อีเมลที่ทำงานสำหรับการทำงานในที่ทำงาน (gitolite) และที่อยู่อีเมลส่วนตัวสำหรับส่วนที่เหลือ (github)

ฉันอ่านเกี่ยวกับวิธีแก้ไขปัญหาต่อไปนี้ซึ่งทั้งหมดเป็นแบบสากลหรือชั่วคราว:

  • git config --global user.email "bob@example.com"
  • git config user.email "bob@example.com"
  • git commit --author "Bob <bob@example.com>"
  • การตั้งค่าหนึ่งในGIT_AUTHOR_EMAIL, GIT_COMMITTER_EMAILหรือEMAILตัวแปรสภาพแวดล้อม

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

มีวิธีผูกที่เก็บชื่อโปรเจ็กต์และอื่น ๆ กับข้อมูลประจำตัว (ชื่ออีเมล) หรือไม่ คนทำอะไร?


1
ฉันขอให้คุณโปรดยอมรับหนึ่งในคำตอบ ฉันหวังว่าหนึ่งในนั้นจะต้องช่วยคุณแก้ไขปัญหาของคุณได้
RBT

คำตอบ:


134

git config user.email "bob@example.com"

การทำอย่างนั้นภายใน repo จะเป็นการตั้งค่าคอนฟิกใน repo นั้นไม่ใช่แบบทั่วโลก

ดูเหมือนว่านั่นจะเป็นสิ่งที่คุณต้องการมากเว้นแต่ฉันจะอ่านคุณผิด


ฉันเดาว่าควรทำ ฉันคาดว่าจะมีที่เก็บในเครื่องหลายแห่งสำหรับโปรเจ็กต์เดียวกันโดยเฉพาะอย่างยิ่งเพื่อที่จะสลับไปมาระหว่างสาขาต่างๆได้ง่ายขึ้นโดยไม่ต้องคอมไพล์ใหม่ทั้งหมด บางทีมันอาจจะเป็นแค่นิสัย svn ที่ไม่ดี ขอบคุณ
Martin Jambon

1
@ Martin - ฉันไม่ได้ใช้ git จริงมานาน แต่ความรู้สึกที่ฉันได้รับก็คือการใช้ repos ในเครื่องหลาย ๆ เครื่องจะเป็นขั้นตอนการทำงานที่ผิดปกติสำหรับคอมไพล์ ถึงกระนั้นคุณจะต้องเรียกใช้สิ่งนี้เพียงครั้งเดียวในอินสแตนซ์ของ repo และกำหนดไว้สำหรับอายุการใช้งานของ repo นั้นดังนั้นจึงไม่เลวร้ายนัก
Dan Ray

@DanRay ในความเป็นจริงมันเป็นการตั้งค่าทั่วไปถ้าเช่นในกรณีของ Martin repo ในเครื่องมีไฟล์ที่ไม่ได้ผูกมัดในเครื่อง การเปลี่ยนจากสาขาหนึ่งไปยังอีกสาขาหนึ่งจะไม่สร้างไฟล์ขึ้นมาใหม่โดยอัตโนมัติ หากหลีกเลี่ยงไม่ให้ "คอมไพล์ใหม่ทุกอย่าง" เป็นเป้าหมายการใช้ repos ในเครื่องหลายรายการเป็นวิธีที่ถูกต้อง
dolmen

1
git config --global user.email "bob@example.com" การเพิ่ม --global ทำให้ใช้งานได้กับ repos ทั้งหมด ที่มา: help.github.com/articles/setting-your-username-in-git
SashiOno

1
นี่เป็นงานที่ต้องทำเองและอาจถูกลืม ระบบอัตโนมัติแนะนำโดย@ dragon788และฉัน
naitsirch

47

คุณต้องใช้คำสั่งชุดโลคัลด้านล่าง:

ชุดท้องถิ่น

git config user.email mahmoud@company.ccc
git config user.name 'Mahmoud Zalt'

รับท้องถิ่น

git config --get user.email
git config --get user.name

ไฟล์กำหนดค่าโลคัลอยู่ในไดเร็กทอรีโปรเจ็กต์: .git/config.

ชุดสากล

git config --global user.email mahmoud@zalt.me
git config --global user.name 'Mahmoud Zalt'

รับทั่วโลก

git config --global --get user.email
git config --global --get user.name

ไฟล์กำหนดค่าส่วนกลางในโฮมไดเร็กทอรีของคุณ: ~/.gitconfig.

อย่าลืมอ้างช่องว่าง ฯลฯ ตัวอย่างเช่น 'FirstName LastName'


23

แก้ไขไฟล์ config ด้วยในโฟลเดอร์ ".git" เพื่อรักษาชื่อผู้ใช้และอีเมลที่แตกต่างกันขึ้นอยู่กับที่เก็บ

  • ไปที่ที่เก็บของคุณ
  • แสดงไฟล์ที่ซ่อนแล้วไปที่โฟลเดอร์ ".git"
  • ค้นหาไฟล์ "config"
  • เพิ่มบรรทัดด้านล่างที่ EOF

[ผู้ใช้]

ชื่อ = Bob

อีเมล = bob@example.com

คำสั่งด้านล่างนี้จะแสดงชื่อผู้ใช้และอีเมลที่ตั้งไว้สำหรับที่เก็บนี้

git config - รับ user.name

git config - รับ user.email

ตัวอย่าง: สำหรับฉันไฟล์ config ใน D: \ workspace \ eclipse \ ipchat \ .git \ config

นี่ ipchat คือชื่อ repo ของฉัน


16

หากคุณใช้git config user.email "foo@example.com"จะผูกพันกับโครงการปัจจุบันที่คุณอยู่

นั่นคือสิ่งที่ฉันทำเพื่อโครงการของฉัน ฉันตั้งค่าข้อมูลประจำตัวที่เหมาะสมเมื่อฉันโคลน / เริ่มต้น repo มันไม่ใช่เรื่องโง่เขลา (ถ้าคุณลืมและผลักดันก่อนที่คุณจะคิดออกว่าคุณถูก hosed) แต่มันก็เป็นเรื่องที่ดีเท่าที่คุณจะทำได้โดยไม่ต้องพูดgit config --global user.email 'ILLEGAL_VALUE'

จริงๆแล้วคุณสามารถสร้างมูลค่าที่ผิดกฎหมายได้ ตั้งค่าไฟล์git config --global user.name $(perl -e 'print "x"x968;')

จากนั้นหากคุณลืมตั้งค่าที่ไม่ใช่ค่าส่วนกลางคุณจะได้รับข้อความแสดงข้อผิดพลาด

[แก้ไข] ในระบบอื่นฉันต้องเพิ่มจำนวน x เป็น 968 เพื่อให้ล้มเหลวด้วย "fatal: Impossible personal identifier" git เวอร์ชันเดียวกัน แปลก.


ดูเหมือนจะเป็นเคล็ดลับที่ดี แต่มันไม่ได้ผลสำหรับฉัน ทั้งส่งและผลักไปยัง gitolite remote ประสบความสำเร็จ
Martin Jambon

@Martin Jambon: แปลก ฉันใช้ git เวอร์ชัน 1.7.4.5
Seth Robertson

@Martin Jambon: คุณสามารถลองตั้งชื่อผู้ใช้ / ที่อยู่อีเมลส่วนกลางของคุณเป็น "x" คอมไพล์เวอร์ชันเก่าบางตัวปฏิเสธค่าที่น้อยเกินไป รายงานเวอร์ชัน git / os ที่คุณมีหากไม่ได้ผล
Seth Robertson

@Martin Jambon: ลอง 968 "x" ดูว่าเหมาะกับคุณหรือไม่
เซ ธ โรเบิร์ตสัน

8

หากคุณไม่ใช้ไฟล์ --globalพารามิเตอร์มันจะตั้งค่าตัวแปรสำหรับโปรเจ็กต์ปัจจุบันเท่านั้น


8

ตั้งแต่ Git 2.13 คุณสามารถใช้ไฟล์ includeIfใน gitconfig เพื่อรวมไฟล์ที่มีคอนฟิกูเรชันอื่นตามพา ธ ของที่เก็บที่คุณรันคำสั่ง git

เนื่องจาก Git ใหม่เพียงพอมาพร้อมกับ Ubuntu 18.04 ฉันจึงใช้สิ่งนี้~/.gitconfigอย่างมีความสุข

[include]
  path = ~/.gitconfig.alias # I like to keep global aliases separate
  path = ~/.gitconfig.defaultusername # can maybe leave values unset/empty to get warned if a below path didn't match
# If using multiple identities can use per path user/email
# The trailing / is VERY important, git won't apply the config to subdirectories without it
[includeIf "gitdir:~/projects/azure/"]
  path = ~/.gitconfig.azure # user.name and user.email for Azure
[includeIf "gitdir:~/projects/gitlab/"]
  path = ~/.gitconfig.gitlab # user.name and user.email for GitLab
[includeIf "gitdir:~/projects/foss/"]
  path = ~/.gitconfig.github # user.name and user.email for GitHub

https://motowilliams.com/conditional-includes-for-git-config#disqus_thread

ในการใช้ Git 2.13 คุณจะต้องเพิ่ม PPA (Ubuntu ที่เก่ากว่า 18.04 / Debian) หรือดาวน์โหลดไบนารีและติดตั้ง (Windows / Linux อื่น ๆ )


มีประโยชน์มากและตรงกับสิ่งที่ฉันกำลังมองหา เมื่อใช้ร่วมกับgit config core.sshCommandคีย์ส่วนตัวหลาย ๆ คีย์จะช่วยให้สามารถจัดการข้อมูลประจำตัวคอมไพล์ได้อย่างสมบูรณ์แบบ
topr

0

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

นั่นคือปัญหาของฉัน ฉันได้เขียนสคริปต์ hook ซึ่งจะเตือนคุณหากคุณมี github remote และไม่มีกำหนดชื่อผู้ใช้ในเครื่อง

วิธีการตั้งค่ามีดังนี้

  1. สร้างไดเร็กทอรีเพื่อยึดโกลบอลเบ็ด

    mkdir -p ~/.git-templates/hooks

  2. บอกให้คอมไพล์คัดลอกทุกอย่างลงในไดเร็กทอรี~/.git-templatesต่อโปรเจ็กต์ของ.gitคุณเมื่อคุณรันgit initหรือโคลน

    git config --global init.templatedir '~/.git-templates'

  3. และตอนนี้คัดลอกบรรทัดต่อไปนี้~/.git-templates/hooks/pre-commitและทำให้ไฟล์ทำงานได้ (อย่าลืมสิ่งนี้มิฉะนั้น git จะไม่ดำเนินการ!)

#!/bin/bash

RED='\033[0;31m' # red color
NC='\033[0m' # no color

GITHUB_REMOTE=$(git remote -v | grep github.com)
LOCAL_USERNAME=$(git config --local user.name)

if [ -n "$GITHUB_REMOTE" ] && [ -z "$LOCAL_USERNAME" ]; then
    printf "\n${RED}ATTENTION: At least one Github remote repository is configured, but no local username. "
    printf "Please define a local username that matches your Github account.${NC} [pre-commit hook]\n\n"
    exit 1
fi

หากคุณใช้โฮสต์อื่นสำหรับที่เก็บส่วนตัวของคุณคุณต้องแทนที่ github.comตามความต้องการของคุณ

ทุกครั้งที่คุณทำgit initหรือgit cloneคอมไพล์จะคัดลอกสคริปต์นี้ไปยังที่เก็บและเรียกใช้งานก่อนที่คอมมิตจะเสร็จสิ้น หากคุณไม่ได้ตั้งชื่อผู้ใช้ในเครื่องระบบจะส่งคำเตือนออกมาและไม่อนุญาตให้คุณกระทำ


0

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

การกำหนดค่าคอมไพล์พื้นฐาน

ยกเลิกการตั้งค่าการกำหนดค่าผู้ใช้ปัจจุบันใน git:

$ git config --global --unset user.name
$ git config --global --unset user.email
$ git config --global --unset user.signingkey

บังคับใช้คอนฟิกูเรชันเอกลักษณ์บนที่เก็บโลคัลใหม่:

$ git config --global user.useConfigOnly true

สร้างนามแฝง Git สำหรับidentityคำสั่งเราจะใช้ในภายหลัง:

$ git config --global alias.identity '! git config user.name "$(git config user.$1.name)"; git config user.email "$(git config user.$1.email)"; git config user.signingkey "$(git config user.$1.signingkey)"; :'

การสร้างตัวตน

สร้างตัวตนด้วย GPG (ใช้gpgหรือgpg2ขึ้นอยู่กับสิ่งที่คุณมีในระบบของคุณ) ทำซ้ำขั้นตอนถัดไปสำหรับข้อมูลประจำตัวแต่ละตัวที่คุณต้องการใช้

หมายเหตุ: [keyid]นี่คือตัวระบุของคีย์ลับที่สร้างขึ้น ตัวอย่างที่นี่:

sec   rsa4096/8A5C011E4CE081A5 2020-06-09 [SC] [expires: 2021-06-09]
      CCC470AE787C057557F421488C4C951E4CE081A5
uid                 [ultimate] Your Name <youremail@domain>
ssb   rsa4096/1EA965889861C1C0 2020-06-09 [E] [expires: 2021-06-09]

8A5C011E4CE081A5ส่วนหนึ่งหลังจากที่sec rsa4096/เป็นตัวบ่งชี้ของคีย์

$ gpg --full-gen-key
$ gpg --list-secret-keys --keyid-format LONG <youremail@domain>
$ gpg --armor --export [keyid]

คัดลอกบล็อกคีย์สาธารณะและเพิ่มในการตั้งค่า GitHub / GitProviderOfChoice ของคุณเป็นคีย์ GPG

เพิ่มเอกลักษณ์ในการกำหนดค่า Git ทำซ้ำสิ่งนี้สำหรับข้อมูลประจำตัวแต่ละรายการที่คุณต้องการเพิ่ม:

หมายเหตุ: นี่ผมใช้gitlabในการตั้งชื่อตัวตนของฉัน แต่จากคำถามของคุณก็สามารถเป็นอะไรก็ได้เช่น: gitoliteหรือgithub, workฯลฯ

$ git config --global user.gitlab.name "Your Name"
$ git config --global user.gitlab.email "youremail@domain"
$ git config --global user.gitlab.signingkey [keyid]

ตั้งค่าเอกลักษณ์สำหรับที่เก็บ

หาก repo ใหม่ไม่มีการเชื่อมโยงข้อมูลประจำตัวข้อผิดพลาดจะปรากฏขึ้นในการคอมมิตเตือนให้คุณตั้งค่า

*** Please tell me who you are.

## parts of message skipped ##

fatal: no email was given and auto-detection is disabled

ระบุข้อมูลประจำตัวที่คุณต้องการบนที่เก็บใหม่:

$ git identity gitlab

ตอนนี้คุณพร้อมที่จะยอมรับข้อมูลประจำตัวของgitlabแล้ว

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