Làm thế nào để nói git sử dụng danh tính chính xác (tên và email) cho một dự án nhất định?


117

Tôi sử dụng máy tính xách tay cá nhân của mình cho cả công việc và các dự án cá nhân và tôi muốn sử dụng địa chỉ email công việc cho cam kết của mình trong công việc (gitolite) và địa chỉ email cá nhân của tôi cho phần còn lại (github).

Tôi đã đọc về các giải pháp sau đây là tất cả các giải pháp toàn cầu hoặc tạm thời:

  • git config --global user.email "bob@example.com"
  • git config user.email "bob@example.com"
  • git commit --author "Bob <bob@example.com>"
  • thiết lập một trong những GIT_AUTHOR_EMAIL, GIT_COMMITTER_EMAILhoặc EMAILbiến môi trường

Một giải pháp là chạy theo cách thủ công một hàm shell đặt môi trường của tôi thành công việc hoặc cá nhân , nhưng tôi khá chắc chắn rằng tôi thường quên chuyển sang danh tính chính xác dẫn đến cam kết dưới danh tính sai.

Có cách nào để ràng buộc một kho lưu trữ nhất định, tên dự án, v.v. với danh tính (tên, email) không? Mọi người làm nghề gì?


1
Tôi yêu cầu bạn vui lòng chấp nhận một trong những câu trả lời. Tôi hy vọng một trong số họ phải đã giúp bạn giải quyết vấn đề của mình.
RBT

Câu trả lời:


134

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

Thực hiện điều đó bên trong repo sẽ đặt cấu hình trên repo ĐÓ chứ không phải trên toàn cầu.

Có vẻ như đó là những gì bạn đang theo đuổi, trừ khi tôi hiểu sai về bạn.


Tôi đoán điều đó nên làm điều đó. Tôi đang mong đợi có nhiều kho lưu trữ cục bộ cho cùng một dự án, đặc biệt là để chuyển đổi giữa các nhánh dễ dàng hơn mà không phải biên dịch lại mọi thứ. Có lẽ đó chỉ là một thói quen xấu của svn. Cảm ơn.
Martin Jambon

1
@ Martin - Tôi đã không sử dụng git thực sự lâu, nhưng cảm giác mà tôi nhận được là sử dụng nhiều repo cục bộ sẽ là một quy trình làm việc không bình thường đối với git. Mặc dù vậy, bạn chỉ cần chạy điều này một lần trên một phiên bản của repo và nó được đặt cho tuổi thọ của repo đó, vì vậy nó không quá tệ.
Dan Ray

@DanRay Trên thực tế, đây là một thiết lập phổ biến nếu, như trong trường hợp Martin, repo cục bộ có các tệp cục bộ không được cam kết. Chuyển từ nhánh này sang nhánh khác sẽ không tự động xây dựng lại tệp. Nếu tránh "biên dịch lại mọi thứ" là một mục tiêu, thì việc sử dụng nhiều repo cục bộ là cách chính xác để làm điều đó.
dolmen

1
git config --global user.email "bob@example.com" Thêm --global làm cho nó hoạt động trên tất cả các repo. source: help.github.com/articles/setting-your-username-in-git
SashiOno 14/03/17

1
Đây là một công việc thủ công và có thể bị quên. Các giải pháp tự động được đề xuất bởi @ dragon788 và tôi
naitsirch 19/03/19

47

Bạn cần sử dụng lệnh đặt cục bộ bên dưới:

bộ địa phương

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

địa phương nhận được

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

Các tập tin cấu hình địa phương là trong thư mục dự án: .git/config.

tập hợp toàn cầu

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

toàn cầu nhận được

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

Các tập tin cấu hình toàn cầu trong trong thư mục chính của bạn: ~/.gitconfig.

Hãy nhớ trích dẫn khoảng trống, v.v., ví dụ: 'FirstName LastName'


23

Chỉnh sửa tệp cấu hình với trong thư mục ".git" để duy trì tên người dùng và email khác nhau tùy thuộc vào kho lưu trữ

  • Đi tới kho lưu trữ của bạn
  • Hiển thị các tệp ẩn và chuyển đến thư mục ".git"
  • Tìm tệp "cấu hình"
  • Thêm các dòng dưới đây tại EOF

[người sử dụng]

name = Bob

email = bob@example.com

Lệnh dưới đây cho bạn biết tên người dùng và email nào được đặt cho kho này.

git config --get user.name

git config --get user.email

Ví dụ: cho tôi tệp cấu hình đó trong D: \ workspace \ eclipse \ ipchat \ .git \ config

Đây ipchat là tên repo của tôi


16

Nếu bạn sử dụng git config user.email "foo@example.com"nó sẽ bị ràng buộc với dự án hiện tại mà bạn đang tham gia.

Đó là những gì tôi làm cho các dự án của mình. Tôi đặt danh tính thích hợp khi tôi sao chép / init repo. Nó không phải là chống lừa (nếu bạn quên và đẩy trước khi bạn nhận ra rằng bạn đã bị lừa) nhưng nó là tốt nhất bạn có thể nhận được nếu không có khả năng nóigit config --global user.email 'ILLEGAL_VALUE'

Trên thực tế, bạn có thể tạo ra một giá trị bất hợp pháp. Đặt của bạngit config --global user.name $(perl -e 'print "x"x968;')

Sau đó, nếu bạn quên đặt các giá trị không phải toàn cục, bạn sẽ nhận được thông báo lỗi.

[CHỈNH SỬA] Trên một hệ thống khác, tôi đã phải tăng số x lên 968 để làm cho nó không thành công với "nghiêm trọng: Số nhận dạng cá nhân không thể dài". Phiên bản tương tự của git. Thật kỳ lạ.


Nghe có vẻ như một thủ thuật tuyệt vời nhưng nó không hiệu quả với tôi. Cả hai commit và push lên gitolite remote đều thành công.
Martin Jambon

@Martin Jambon: Lạ thật. Tôi đang sử dụng git phiên bản 1.7.4.5
Seth Robertson

@Martin Jambon: Bạn cũng có thể thử đặt tên người dùng / địa chỉ email chung của mình thành "x". Một số phiên bản git cũ hơn đã từ chối các giá trị quá nhỏ. Báo cáo phiên bản git / hệ điều hành bạn có nếu điều này không hoạt động.
Seth Robertson

@Martin Jambon: Hãy thử 968 "x" và xem liệu điều đó có phù hợp hơn với bạn không.
Seth Robertson

8

Nếu bạn không sử dụng --globaltham số, nó sẽ chỉ đặt các biến cho dự án hiện tại.


8

Kể từ Git 2.13, bạn có thể sử dụng includeIf trong gitconfig của mình để bao gồm một tệp có cấu hình khác dựa trên đường dẫn của kho lưu trữ nơi bạn đang chạy các lệnh git của mình.

Kể từ khi có một Git đủ mới đi kèm với Ubuntu 18.04, tôi đã sử dụng nó ~/.gitconfigmột cách khá vui vẻ.

[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

Để sử dụng Git 2.13, bạn sẽ cần thêm PPA (Ubuntu cũ hơn 18.04 / Debian) hoặc tải xuống tệp nhị phân và cài đặt (Windows / Linux khác).


Rất hữu ích và chính xác những gì tôi đang tìm kiếm. Được kết hợp với git config core.sshCommandnhiều khóa riêng tư, cho phép quản lý danh tính git liền mạch hoàn toàn.
topr

0

Một giải pháp là chạy theo cách thủ công một hàm shell đặt môi trường của tôi thành công việc hoặc cá nhân, nhưng tôi khá chắc chắn rằng tôi thường quên chuyển sang nhận dạng chính xác dẫn đến việc xác nhận sai danh tính.

Đó chính xác là vấn đề của tôi. Tôi đã viết một script hook cảnh báo bạn nếu bạn có bất kỳ điều khiển từ xa github nào và không xác định tên người dùng cục bộ.

Đây là cách bạn thiết lập nó:

  1. Tạo một thư mục để giữ toàn cục hook

    mkdir -p ~/.git-templates/hooks

  2. Yêu cầu git sao chép mọi thứ vào ~/.git-templatesthư mục cho mỗi dự án của .gitbạn khi bạn chạy git init hoặc clone

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

  3. Và bây giờ sao chép các dòng sau vào ~/.git-templates/hooks/pre-commitvà làm cho tệp thực thi được (đừng quên điều này nếu không git sẽ không thực thi nó!)

#!/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

Nếu bạn sử dụng các máy chủ khác cho kho riêng của mình, bạn phải thay thế github.comtheo nhu cầu của mình.

Bây giờ mỗi khi bạn thực hiện a git inithoặc git clonegit sẽ sao chép tập lệnh này vào kho lưu trữ và thực thi nó trước khi thực hiện bất kỳ cam kết nào. Nếu bạn chưa đặt tên người dùng cục bộ, nó sẽ xuất ra cảnh báo và không cho phép bạn cam kết.


0

Tôi rất thích cách của Micah Henning trong bài viết của anh ấy (xem Thiết lập Nhận dạng Git ) về chủ đề này. Thực tế là anh ta áp dụng và buộc nhận dạng cho từng kho lưu trữ được tạo / nhân bản là một cách tốt đừng quên thiết lập điều này mỗi lần.

Cấu hình git cơ bản

Bỏ đặt cấu hình người dùng hiện tại trong git:

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

Buộc cấu hình danh tính trên mỗi kho lưu trữ cục bộ mới:

$ git config --global user.useConfigOnly true

Tạo bí danh Git cho identitylệnh, chúng ta sẽ sử dụng sau:

$ 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)"; :'

Tạo danh tính

Tạo danh tính với GPG (sử dụng gpghoặc gpg2tùy thuộc vào những gì bạn có trên hệ thống của mình). Lặp lại các bước tiếp theo cho từng danh tính bạn muốn sử dụng.

Lưu ý: [keyid]đây là định danh của khóa bí mật đã tạo. Ví dụ ở đây:

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]

Phần 8A5C011E4CE081A5sau sec rsa4096/định danh của khóa.

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

Sao chép khối khóa công khai và thêm nó vào cài đặt GitHub / GitProviderOfChoice của bạn dưới dạng khóa GPG.

Thêm danh tính vào cấu hình Git. Cũng lặp lại điều này cho mỗi danh tính bạn muốn thêm:

Lưu ý: ở đây tôi sử dụng gitlabđể đặt tên cho danh tính của tôi, nhưng từ câu hỏi của bạn nó có thể là bất cứ điều gì, ví dụ: gitolitehoặc github, workvv

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

Thiết lập danh tính cho một kho lưu trữ

Nếu một repo mới không có danh tính được liên kết, một lỗi sẽ xuất hiện khi cam kết, nhắc bạn thiết lập nó.

*** Please tell me who you are.

## parts of message skipped ##

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

Chỉ định danh tính bạn muốn trên một kho lưu trữ mới:

$ git identity gitlab

Bây giờ bạn đã sẵn sàng cam kết với danh tính gitlab .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.