Tôi có thể chỉ định nhiều người dùng cho mình trong .gitconfig không?


755

Theo tôi ~/.gitconfig, tôi liệt kê địa chỉ email cá nhân của mình [user], vì đó là những gì tôi muốn sử dụng cho repos Github.

Nhưng, gần đây tôi cũng bắt đầu sử dụng git cho công việc. Git repo của công ty tôi cho phép tôi cam kết, nhưng khi nó gửi thông báo về các thay đổi mới, họ nói rằng họ đến từ Ẩn danh vì nó không nhận ra địa chỉ email trong tôi .gitconfig- ít nhất, đó là lý thuyết của tôi.

Có thể chỉ định nhiều [user]định nghĩa trong .gitconfig? Hoặc có một số cách khác để ghi đè mặc định .gitconfigcho một thư mục nhất định? Trong trường hợp của tôi, tôi kiểm tra tất cả các mã công việc trong ~/worksrc/- có cách nào để chỉ định một .gitconfigchỉ cho thư mục đó (và các thư mục con của nó) không?



1
Tôi ngạc nhiên rằng máy chủ của công ty bạn sẽ làm điều đó - nó sẽ phải THAY ĐỔI sha của cam kết của bạn để điều đó hoạt động. Nếu bạn cam kết thanh toán cục bộ, bạn thấy tên người dùng nào?
Alex Brown

1
@Alex: Quên bit quan trọng ở đó - nó có thể dễ dàng chỉ là một tên trong thông báo email, không thực sự thay đổi bất cứ điều gì trên cam kết.
Cascabel

1
Bạn có thể sử dụng git-hook để tự động hóa công việc định kỳ này: github.com/DrVanScott/git-clone-init
Henning

1
Vui lòng chấp nhận câu trả lời này: stackoverflow.com/a/43654115/482899 . Đó là giải pháp tốt nhất kể từ git 2.13.
Northtree

Câu trả lời:


1017

Bạn có thể định cấu hình một repo riêng để sử dụng một địa chỉ email / người dùng cụ thể ghi đè cấu hình toàn cầu. Từ gốc của repo, chạy

git config user.name "Your Name Here"
git config user.email your@email.com

trong khi người dùng / email mặc định được định cấu hình trong ~ / .gitconfig của bạn

git config --global user.name "Your Name Here"
git config --global user.email your@email.com

83
bạn có thể thấy tác dụng của các cài đặt này trong .git/configtệp
Abizern

21
Bạn có thể tự chỉnh sửa các tệp cấu hình đó bằng git config --editgit config --global --edit. Và trong trường hợp bạn bỏ lỡ bình luận của Abizern , tệp cấu hình của kho lưu trữ là tại <repo-root>/.git/config.
Rory O'Kane

13
Bạn cũng nên bỏ đặt GIT_AUTHOR_EMAILGIT_COMMITTER_EMAIL (và * _NAME) vì chúng sẽ ghi đè cài đặt cục bộ
ACyclic

6
Có cách nào để làm điều này cho tất cả các repos trong một thư mục nhất định, thay vì cho các repos riêng lẻ không? Xem câu hỏi của tôi ở đây: stackoverflow.com/questions/21307793/ từ
scubbo

6
Xem câu trả lời dưới đây để biết thêm giải pháp cập nhật với Git 2.13phát hành ngày hôm nay.
tejasbubane

491

Kể từ git 2.13 , có thể giải quyết điều này bằng cách sử dụng Điều kiện mới được giới thiệu bao gồm .

Một ví dụ:

Cấu hình toàn cầu ~ / .gitconfig

[user]
    name = John Doe
    email = john@doe.tld

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

Cấu hình cụ thể làm việc ~ / work / .gitconfig

[user]
    email = john.doe@company.tld

48
Đây là câu trả lời tốt nhất hiện nay khi git 2.13 đã được phát hành.
tejasbubane

1
Giải pháp này có hoạt động cho tất cả các thư mục con trong một thư mục được chỉ định trong câu lệnh bao gồm không, giả sử rằng chúng không có tệp .gitconfig của riêng chúng? Tôi sẽ nghĩ như vậy, nhưng cho đến nay thử nghiệm đã không sinh ra điều này.
Gary

2
@Gary Có, theo kinh nghiệm của tôi và các tài liệu: Triệu Nếu mẫu kết thúc bằng /, ** sẽ được tự động thêm vào. Ví dụ, mẫu foo / trở thành foo / **. Nói cách khác, nó khớp với "foo" và mọi thứ bên trong, đệ quy. bao gồm tất cả các kho lưu trữ trong $ HOME / to / nhóm [bao gồm "gitdir: ~ / to / group /"],
Tomáš Janoušek

6
Các gitdir nên bao gồm người cuối cùng '/'.
Chris Yim

5
Bạn có thể kiểm tra xem nó hoạt động đệ quy bằng cách chạy git config --listtrong các thư mục khác nhau. Trong các thư mục con ~/work/chứa kho git, includeIfsẽ có hiệu lực. Lưu ý rằng trong các thư mục con ~/work/không chứa kho git, tệp includeIfnày không được thực thi.
NZD

105

Hoặc bạn có thể thêm thông tin sau vào .git/configtệp cục bộ của mình

[user]  
    name = Your Name
    email = your.email@gmail.com

27
... đó là cách thủ công để thực hiện những gì các lệnh được đề xuất bởi @discom bồ làm cho bạn.
dùng456584

1
Có thể thêm nhiều dòng này trên mỗi điều khiển không?
Abel Callejo

55

Một lệnh chuyển đổi tài khoản github

Giải pháp này có dạng một bí danh git duy nhất. Sau khi thực hiện, người dùng dự án hiện tại sẽ được đính kèm vào một tài khoản khác

Tạo khóa ssh

ssh-keygen -t rsa -C "rinquin.arnaud@gmail.com" -f '/Users/arnaudrinquin/.ssh/id_rsa'

[...]

ssh-keygen -t rsa -C "arnaud.rinquin@wopata.com" -f '/Users/arnaudrinquin/.ssh/id_rsa_pro'

Liên kết chúng với tài khoản GitHub / Bitbucket của bạn

  1. sao chép khóa công khai mặc định pbcopy < ~/.ssh/id_rsa.pub
  2. đăng nhập vào tài khoản GitHub của bạn
  3. dán khóa vào add SSH keytrang github
  4. sao chép khóa công khai khác pbcopy < ~/.ssh/id_rsa_pro.pub
  5. lặp lại và điều chỉnh các bước từ 2 đến 4 cho mọi tài khoản khác

Bước 1. Tự động chuyển khóa ssh.

Chúng tôi có thể định cấu hình sshđể gửi sử dụng một khóa mã hóa cụ thể tùy thuộc vào host. Điều tốt đẹp là bạn có thể có một vài bí danh cho cùng hostname.

Xem ~/.ssh/configtập tin ví dụ này :

# Default GitHub
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa

# Professional github alias
Host github_pro
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_pro

cấu hình từ xa

Bây giờ bạn có thể sử dụng các bí danh này trong điều khiển từ xa bằng cách thay đổi git@github.combởi git@github_pro.

Bạn có thể thay đổi điều khiển từ xa các dự án hiện tại (sử dụng cái gì đó như git remote set-url origin git@github_pro:foo/bar.git) hoặc điều chỉnh chúng trực tiếp khi nhân bản chúng.

git clone git@github.com:ArnaudRinquin/atom-zentabs.git

sử dụng bí danh, nó trở thành:

git clone git@github_pro:ArnaudRinquin/atom-zentabs.git

Bước 2. Thay đổi git user.email

Cài đặt cấu hình Git có thể là toàn cục hoặc theo từng dự án. Trong trường hợp của chúng tôi, chúng tôi muốn một cài đặt cho mỗi dự án. Rất dễ dàng để thay đổi nó:

git config user.email 'arnaud.rinquin@wopata.com'

Mặc dù điều này là dễ dàng, nhưng nó sẽ mất nhiều thời gian cho các nhà phát triển chúng tôi. Chúng ta có thể viết một bí danh git rất đơn giản cho điều đó.

Chúng tôi sẽ thêm nó vào ~/.gitconfigtập tin.

[user]
    name = Arnaud Rinquin
    email = rinquin.arnaud@gmail.com

...

[alias]
    setpromail = "config user.email 'arnaud.rinquin@wopata.com'"

Sau đó, tất cả những gì chúng ta phải làm là git setpromail chỉ thay đổi email của chúng tôi cho dự án này.

Bước 3. Xin vui lòng chuyển đổi một lệnh?!

Sẽ không tốt nếu chuyển từ tài khoản mặc định sang tài khoản được chỉ định bằng một lệnh không tham số duy nhất? Điều này là chắc chắn có thể. Lệnh này sẽ có hai bước:

  • thay đổi điều khiển từ xa dự án hiện tại sang các bí danh đã chọn
  • thay đổi người dùng dự án hiện tại.email config

Chúng tôi đã có một giải pháp lệnh cho bước thứ hai, nhưng bước đầu tiên khó hơn nhiều. Một lệnh thay đổi máy chủ từ xa

Đây là giải pháp dưới dạng một lệnh bí danh git khác để thêm vào ~/.gitconfig:

[alias]
  changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"

Điều này cho phép thay đổi tất cả các điều khiển từ xa từ máy chủ này sang máy chủ khác (bí danh). Xem ví dụ:

$ > git remote -v
origin  git@github.com:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  git@github.com:ArnaudRinquin/arnaudrinquin.github.io.git (push)

$ > git changeremotehost github.com github_pro

$ > git remote -v
origin  git@github_pro:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  git@github_pro:ArnaudRinquin/arnaudrinquin.github.io.git (push)

Kết hợp tất cả

Bây giờ chúng ta chỉ cần kết hợp hai lệnh thành một, điều này khá dễ dàng. Xem cách tôi cũng tích hợp chuyển đổi máy chủ bitbucket.

[alias]
  changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"
  setpromail = "config user.email 'arnaud.rinquin@wopata.com'"
  gopro = !sh -c \"git changeremotehost github.com github_pro && git changeremotehost bitbucket.com bitbucket_pro && git setpromail\"

Liên kết nguồn -Hướng dẫn


Điều này thật tuyệt vời, cảm ơn. Tôi làm việc với một loạt các repos cho mỗi email để setpromailbí danh của tôi config --globalthay thế (và tôi có các bí danh khác để đặt các địa chỉ email khác nhau). Nó hoạt động!
michel-slm

1
Đối với 2 tài khoản khác nhau, làm cách nào tôi có thể đăng nhập bằng các khóa gpg khác nhau? Tôi có các khóa gpg 2x cho các tài khoản github 2x và muốn ký khác. "git config --global user.signingkey xxxx"
hakkican

Câu trả lời này là tuyệt vời. Tôi gần như đã không đọc nó bởi vì tôi nghĩ rằng tôi đã tìm thấy những gì từ câu trả lời khác. Chắc chắn xứng đáng được nâng cao hơn. Tái bút Nó thậm chí còn tốt hơn khi kết hợp với useConfigOnly = truetừ câu trả lời khác.
steinybot

Không xác định được, đó là IdenfityFile.
Christian

40

Sau khi nhận được một số cảm hứng từ bài đăng trên blog của Orr Sella, tôi đã viết một hook hook trước (cư trú ~/.git/templates/hooks) sẽ đặt tên người dùng và địa chỉ e-mail cụ thể dựa trên thông tin bên trong một repositor của địa phương./.git/config :

Bạn phải đặt đường dẫn đến thư mục mẫu vào ~/.gitconfig:

[init]
    templatedir = ~/.git/templates

Sau đó, mỗi git inithoặc git clonesẽ chọn móc đó và sẽ áp dụng dữ liệu người dùng trong lần tiếp theo git commit. Nếu bạn muốn áp dụng hook cho việc thoát khỏi repos thì chỉ cần chạy một git initbên trong repo để xác định lại nó.

Đây là cái móc tôi nghĩ ra (nó vẫn cần đánh bóng - những gợi ý được chào đón). Lưu nó dưới dạng

~/.git/templates/hooks/pre_commit

hoặc là

~/.git/templates/hooks/post-checkout

và chắc chắn rằng nó có thể thực thi được: chmod +x ./post-checkout || chmod +x ./pre_commit

#!/usr/bin/env bash

# -------- USER CONFIG
# Patterns to match a repo's "remote.origin.url" - beginning portion of the hostname
git_remotes[0]="Github"
git_remotes[1]="Gitlab"

# Adjust names and e-mail addresses
local_id_0[0]="my_name_0"
local_id_0[1]="my_email_0"

local_id_1[0]="my_name_1"
local_id_1[1]="my_email_1"

local_fallback_id[0]="${local_id_0[0]}"
local_fallback_id[1]="${local_id_0[1]}"


# -------- FUNCTIONS
setIdentity()
{
    local current_id local_id

    current_id[0]="$(git config --get --local user.name)"
    current_id[1]="$(git config --get --local user.email)"

    local_id=("$@")

    if [[ "${current_id[0]}" == "${local_id[0]}" &&
          "${current_id[1]}" == "${local_id[1]}" ]]; then
        printf " Local identity is:\n"
        printf "»  User: %s\n»  Mail: %s\n\n" "${current_id[@]}"
    else
        printf "»  User: %s\n»  Mail: %s\n\n" "${local_id[@]}"
        git config --local user.name "${local_id[0]}"
        git config --local user.email "${local_id[1]}"
    fi

    return 0
}

# -------- IMPLEMENTATION
current_remote_url="$(git config --get --local remote.origin.url)"

if [[ "$current_remote_url" ]]; then

    for service in "${git_remotes[@]}"; do

        # Disable case sensitivity for regex matching
        shopt -s nocasematch

        if [[ "$current_remote_url" =~ $service ]]; then
            case "$service" in

                "${git_remotes[0]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[0]}"
                    setIdentity "${local_id_0[@]}"
                    exit 0
                    ;;

                "${git_remotes[1]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[1]}"
                    setIdentity "${local_id_1[@]}"
                    exit 0
                    ;;

                * )
                    printf "\n»  pre-commit hook: unknown error\n» Quitting.\n"
                    exit 1
                    ;;

            esac
        fi
    done
else
    printf "\n»» An Intermission\n»  No remote repository set. Using local fallback identity:\n"
    printf "»  User: %s\n»  Mail: %s\n\n" "${local_fallback_id[@]}"

    # Get the user's attention for a second
    sleep 1

    git config --local user.name "${local_fallback_id[0]}"
    git config --local user.email "${local_fallback_id[1]}"
fi

exit 0

BIÊN TẬP:

Vì vậy, tôi viết lại hook như một hook và lệnh trong Python. Ngoài ra, bạn cũng có thể gọi tập lệnh là lệnh Git ( git passport). Ngoài ra, có thể xác định số ID tùy ý bên trong configfile ( ~/.gitpassport) có thể chọn trên dấu nhắc. Bạn có thể tìm thấy dự án tại github.com: git-Passport - Lệnh Git và hook được viết bằng Python để quản lý nhiều tài khoản Git / danh tính người dùng .


1
Cái này hoạt động gọn gàng. Tuy nhiên, nó hoạt động tốt hơn đối với tôi bằng cách biến nó thành một cái móc sau thanh toán (thay vì sau khi cam kết). Gợi ý của tôi để cải thiện câu trả lời này được, đề cập rằng: 1. đoạn cần phải được lưu lại dưới dạng ~ / .git / templates / móc / hậu kiểm và được phép cúp chmod +x post-checkout, 2. git_remotesgiá trị được bắt đầu phần của toàn bộ hostname, ví dụ git@github.com, 3. local_idcác giá trị nên được chỉnh sửa bởi người dùng theo tên và địa chỉ email tương ứng.
Chaianu Kumar

@ShantanuKumar Cảm ơn bình luận của bạn. Tôi điều chỉnh câu trả lời như bạn đề xuất. Có lẽ tôi sẽ viết lại kịch bản trong Python sớm.
Saucier

Đã thêm hỗ trợ cho các biểu thức thông thường và cho các kho lưu trữ mà không cần điều khiển từ xa. Để dễ dàng tải về tất cả hợp nhất ở đây . Regexps để phân biệt danh tính cho các dự án khác nhau trên cùng một dịch vụ. Và hỗ trợ reposess reposess với ví dụ như một danh tính mặc định có ý nghĩa nếu bạn git initdự án mới từ IDE như eclipse(không thể xử lý các kích hoạt tiền cam kết tương tác)
cfi

25

Nếu bạn không muốn có một địa chỉ email mặc định ( địa chỉ email liên kết đến người dùng github ), bạn có thể định cấu hình mà bạn muốn được hỏi. Làm thế nào bạn có thể làm điều đó phụ thuộc vào phiên bản git bạn sử dụng, xem bên dưới.

Hạn chế (dự định) là bạn phải định cấu hình địa chỉ email (và tên của bạn) một lần cho mỗi kho lưu trữ. Vì vậy, bạn không thể quên làm điều đó.

Phiên bản <2.7.0

[user]
    name = Your name
    email = "(none)"

trong cấu hình toàn cầu của bạn ~/.gitconfignhư đã nêu trong một nhận xét của Dan Aloni trong bài đăng trên blog của Orr Sella . Khi cố gắng thực hiện cam kết đầu tiên trong kho lưu trữ, git không thành công với thông báo hay:

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '(none)')

Tên được lấy từ cấu hình chung khi địa chỉ email được đặt cục bộ (thông báo không hoàn toàn chính xác).

2.7.0 Phiên bản <2.8.0

Hành vi trong các phiên bản <2.7.0 không được dự định và cố định với 2.7.0. Bạn vẫn có thể sử dụng hook pre-commit như được mô tả trong bài đăng trên blog của Orr Sella . Giải pháp này cũng hoạt động cho các phiên bản khác, nhưng các giải pháp khác không dành cho phiên bản này.

Phiên bản ≥ 2.8.0

Dan Aloni đã thêm một tùy chọn để đạt được hành vi đó (xem ghi chú phát hành ). Sử dụng nó với:

[user]
    useConfigOnly = true

Để làm cho nó hoạt động, bạn không được cung cấp tên hoặc địa chỉ email trong cấu hình toàn cầu. Sau đó, ở lần xác nhận đầu tiên, bạn nhận được thông báo lỗi

fatal: user.useConfigOnly set but no name given

Vì vậy, thông điệp không mang tính hướng dẫn nhiều, nhưng vì bạn đặt tùy chọn rõ ràng, bạn nên biết phải làm gì. Ngược lại với giải pháp của các phiên bản <2.7.0, bạn luôn phải đặt cả tên và email theo cách thủ công.


Tôi sử dụng phương pháp này trong một vài tháng, nó hoạt động rất tốt. Tôi có nhiều địa chỉ email (cá nhân, công việc) và tôi không muốn có một địa chỉ "mặc định" được định cấu hình trong gitconfig toàn cầu. Với giá trị đặc biệt "(không có)" git sẽ nhắc tôi cung cấp địa chỉ hợp lệ mỗi khi tôi quay lại một repo mới, thay vì đoán một địa chỉ dựa trên tên người dùng và tên máy chủ (điều này gây khó chịu và tôi cần phải - đổi nó). Tuy nhiên, gần đây với phiên bản nâng cấp của Git (2.7.0, có thể sớm hơn), tôi phát hiện ra rằng giá trị đặc biệt "(không có)" không kích hoạt các lỗi nghiêm trọng nữa. Thay vào đó, nó sẽ chỉ sử dụng "John Doe <(none)>" như ...
Zhuoyun Wei 2/2/2016

@wzyboy: Ồ, bạn nói đúng. Tôi đã từng git bisectthấy rằng cam kết 19ce497c ... đã giới thiệu hành vi này. Tuy nhiên, độc lập với phiên bản (2.5 - 2.7) tôi có thể sử dụng email =(không có đối số) trong cấu hình và nó hiển thị hành vi tương tự như email = "(none)"trong các phiên bản cũ. Bạn có thể xác nhận điều này? Nếu vậy, tôi sẽ chỉnh sửa câu trả lời của tôi. Tôi chỉ hoài nghi vì nó có vẻ quá rõ ràng và tôi đã không sử dụng nó trước đây.
Giăng

Tôi đã thử email =trong 2.7.0, Git vẫn đoán địa chỉ email dựa trên tên người dùng và tên máy chủ. Bây giờ tôi sử dụng pre-commitphương pháp tiếp cận trong blog của Sella. Tôi cũng đã thông báo cho Dan Aloni, người đã đưa ra "(none)"ý tưởng trong bài đăng của Sella và anh ấy đã nộp một bản vá để chính thức thực hiện điều này như một tính năng: permalink.gmane.org/gmane.comp.version-control.git/285602
Zhuoyun Wei

3
Kể từ git-2.8: Biến cấu hình "user.useConfigOnly" có thể được sử dụng để buộc người dùng luôn đặt user.email & user.name github.com/git/git/blob/master/Documentation/RelNotes/2.8.0. txt
rofrol

@rofrol Cảm ơn thông tin. Tôi cập nhật câu trả lời của tôi cho phù hợp.
Giăng

24

Với điều kiện bao gồm trong Git 2.13, giờ đây có thể có nhiều người dùng / email cùng tồn tại trên một máy với ít công việc.

user.gitconfigcó tên và email cá nhân của tôi. work-user.gitconfigcó tên công việc và email của tôi. Cả hai tập tin đều ở~ đường dẫn.

Vì vậy, tên / email cá nhân của tôi áp dụng theo mặc định. Đối với c:/work/dir, tên công việc / email của tôi được áp dụng. Đối với c:/work/github/dir, tên / email cá nhân của tôi được áp dụng. Điều này hoạt động như cài đặt cuối cùng được áp dụng.

# ~/.gitconfig
[include]
    path = user.gitconfig
[includeIf "gitdir/i:c:/work/"]
    path = work-user.gitconfig
[includeIf "gitdir/i:c:/work/github/"]
    path = user.gitconfig

gitdir là trường hợp nhạy cảm và gitdir/i không phân biệt chữ hoa chữ thường.

"gitdir/i:github/"sẽ áp dụng điều kiện bao gồm cho bất kỳ thư mục có githubtrong đường dẫn của nó.


Trong khi câu trả lời của bạn được đánh giá cao và Tomáš Janoušek tốt đã đưa ra cùng 20 ngày trước bạn. Hãy xem xét xóa câu trả lời này.
Hedge

5
@ Hedge Có, tôi đã nâng cao câu trả lời của anh ấy, nhưng tôi phải mất một thời gian để cấu hình trên các cửa sổ và đó là nơi gitdir/igiúp tôi hiểu (câu trả lời của anh ấy không đề cập đến).
hIpPy

Cách cụ thể @hIpPy đã triển khai điều này được áp dụng trực tiếp vào trường hợp sử dụng của tôi và làm cho nó dễ thực hiện hơn nhiều so với câu trả lời của Tomas. Tôi ủng hộ cả hai.
Isaac Adams

18

Một tùy chọn khác gitđể làm việc với nhiều tên / email là bằng cách đặt bí danh gitvà sử dụng -ccờ để ghi đè cấu hình toàn cục và kho lưu trữ cụ thể.

Ví dụ: bằng cách xác định bí danh:

alias git='/usr/bin/git -c user.name="Your name" -c user.email="name@example.com"'

Để xem nó hoạt động, chỉ cần gõ git config user.email:

$ git config user.email
name@example.com

Thay vì bí danh, bạn cũng có thể đặt một gittệp thực thi tùy chỉnh trong của bạn $PATH.

#!/bin/sh
/usr/bin/git -c user.name="Your name" -c user.email="name@example.com" "$@"

Một lợi thế của các phương thức này so với một kho lưu trữ cụ thể .git/configlà nó áp dụng cho mọi gitkho lưu trữ khi gitchương trình tùy chỉnh được kích hoạt. Bằng cách này, bạn có thể dễ dàng chuyển đổi giữa người dùng / tên mà không cần sửa đổi bất kỳ cấu hình (chia sẻ) nào.


14

bí danh git (và các phần trong cấu hình git) để giải cứu!

thêm một bí danh (từ dòng lệnh):

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

sau đó, thiết lập, ví dụ

git config --global user.github.name "your github username"
git config --global user.github.email your@github.email

và trong một repo mới hoặc nhân bản, bạn có thể chạy lệnh này:

git identity github

Giải pháp này không phải là tự động, nhưng người dùng unset và email trong toàn cầu của bạn ~/.gitconfigvà thiết lập user.useConfigOnlyđể truesẽ buộc git để nhắc nhở bạn cài đặt chúng bằng tay trong mỗi repo mới hoặc nhân bản.

git config --global --unset user.name
git config --global --unset user.email
git config --global user.useConfigOnly true

1
Tôi thích giải pháp của bạn; tuy nhiên, khi tôi bỏ đặt toàn cầu, nó chỉ thực hiện cam kết với tên máy chủ của máy tính của tôi chứ không phải là git nhắc tôi đặt chúng trong bất kỳ repo nào :(
ANH618

12

Dưới đây là các bước hoàn chỉnh sau khi đọc nhiều câu trả lời ở đây

Cách thiết lập nhiều cài đặt Khóa SSH cho tài khoản github khác nhau

Bạn có thể muốn bắt đầu kiểm tra các khóa hiện đang lưu của mình

$ ssh-add -l

Nếu bạn quyết định xóa tất cả các khóa được lưu trong bộ nhớ cache trước đó ( tùy chọn, hãy cẩn thận về việc này )

$ ssh-add -D

Sau đó, bạn có thể tạo một ssh pub / private private được liên kết với từng email / tài khoản mà bạn muốn / cần sử dụng

$ cd ~/.ssh
$ ssh-keygen -t rsa -C "work@company.com" <-- save it as "id_rsa_work"
$ ssh-keygen -t rsa -C "pers@email.com" <-- save it as "id_rsa_pers"

Sau khi thực hiện lệnh này, bạn sẽ có các tệp sau được tạo

~/.ssh/id_rsa_work      
~/.ssh/id_rsa_work.pub

~/.ssh/id_rsa_pers
~/.ssh/id_rsa_pers.pub 

Đảm bảo tác nhân xác thực đang chạy

$ eval `ssh-agent -s`

Thêm các khóa được tạo như sau (từ thư mục ~ / .ssh)

$ ssh-add id_rsa_work
$ ssh-add id_rsa_pers

Bây giờ bạn có thể kiểm tra lại các khóa đã lưu của mình

$ ssh-add -l

Bây giờ bạn cần thêm các khóa công khai được tạo vào máy chủ github / bickbologne của mình Acces Keys

Sao chép từng repos vào các thư mục khác nhau

Chuyển đến thư mục nơi người dùng làm việc sẽ làm việc và thực hiện điều này

$ git config user.name "Working Hard"
$ git config user.email "work@company.com" 

Chỉ để xem những gì nó kiểm tra nội dung của ".git / config"

Chuyển đến thư mục mà người dùng pers sẽ làm việc và thực hiện điều này

$ git config user.name "Personal Account"
$ git config user.email "pers@email.com" 

Chỉ để xem những gì nó kiểm tra nội dung của ".git / config"

Sau tất cả, bạn sẽ có thể cam kết mã cá nhân và mã công việc của mình bằng cách chuyển đổi giữa hai thư mục đó

Trong trường hợp bạn đang sử dụng Git Bash và cần tạo các khóa ssh trong Windows, hãy làm theo các bước sau:

https://support.automaticsync.com/hc/en-us/articles/202357115-Generating-an-SSH-Key-on-Windows


9

Có một giải pháp đơn giản dường như hoạt động tốt để tránh sai lầm.

Chỉ cần xóa [user]phần này khỏi phần của bạn ~/.gitconfig, điều này sẽ ngăn bạn thực hiện bất kỳ cam kết nào mà không cần thiết lập user.namecho mỗi kho lưu trữ.

Trong của bạn ~/.bashrc, thêm một số bí danh đơn giản cho người dùng và email:

alias ggmail='git config user.name "My Name";git config user.email me@gmail.com'
alias gwork='git config user.name "My Name";git config user.email me@work.job'

Không phải là lý do tuyệt vời, bạn sẽ nhân đôi cấu hình trong mỗi repo git
đúng giờ

9

Câu trả lời này được lấy cảm hứng một phần từ bài đăng của @Saucier, nhưng tôi đang tìm kiếm một cách tự động để thiết lập user.nameuser.email trên cơ sở mỗi repo, dựa trên điều khiển từ xa, nhẹ hơn một chút so với gói git-Passport mà anh ấy đã phát triển . Đồng thời gửi tới @John cho cài đặt useConfigOnly. Đây là giải pháp của tôi:

.gitconfig thay đổi:

[github]
    name = <github username>
    email = <github email>
[gitlab]
    name = <gitlab username>
    email = <gitlab email>
[init]
    templatedir = ~/.git-templates
[user]
    useConfigOnly = true

móc kiểm tra sau nên được lưu vào đường dẫn sau ~/.git-templates/hooks/post-checkout::

#!/usr/bin/env bash

# make regex matching below case insensitive
shopt -s nocasematch

# values in the services array should have a corresponding section in
# .gitconfig where the 'name' and 'email' for that service are specified
remote_url="$( git config --get --local remote.origin.url )"
services=(
    'github'
    'gitlab'
)

set_local_user_config() {
    local service="${1}"
    local config="${2}"
    local service_config="$( git config --get ${service}.${config} )"
    local local_config="$( git config --get --local user.${config} )"

    if [[ "${local_config}" != "${service_config}" ]]; then
        git config --local "user.${config}" "${service_config}"
        echo "repo 'user.${config}' has been set to '${service_config}'"
    fi
}

# if remote_url doesn't contain the any of the values in the services
# array the user name and email will remain unset and the
# user.useConfigOnly = true setting in .gitconfig will prompt for those
# credentials and prevent commits until they are defined
for s in "${services[@]}"; do
    if [[ "${remote_url}" =~ "${s}" ]]; then
        set_local_user_config "${s}" 'name'
        set_local_user_config "${s}" 'email'
        break
    fi
done

Tôi sử dụng các thông tin khác nhau cho github và gitlab, nhưng các tham chiếu trong mã ở trên có thể được thay thế hoặc tăng cường với bất kỳ dịch vụ nào bạn sử dụng. Để hook hook sau thanh toán tự động đặt tên người dùng và email cục bộ cho repo sau khi thanh toán, hãy đảm bảo tên dịch vụ xuất hiện trong url từ xa, thêm nó vào mảng dịch vụ trong post-checkouttập lệnh và tạo một phần cho nó trong của bạn .gitconfigcó chứa tên người dùng và email cho dịch vụ đó.

Nếu không có tên dịch vụ nào xuất hiện trong url từ xa hoặc repo không có từ xa, tên người dùng và email sẽ không được đặt cục bộ. Trong những trường hợp này, user.useConfigOnlycài đặt sẽ ở chế độ không cho phép bạn thực hiện các cam kết cho đến khi tên người dùng và email được đặt ở cấp repo và sẽ nhắc người dùng định cấu hình thông tin đó.


1
Giải pháp tuyệt vời. Đừng quên chmod 755tập lệnh hook. Nếu không, nó sẽ được sao chép nhưng không bao giờ được thực thi.
onekiloparsec

5

GIT_AUTHOR_EMAIL + địa phương .bashrc

.bashrc_local: không theo dõi tệp này, chỉ đặt nó trên máy tính làm việc của bạn:

export GIT_AUTHOR_EMAIL='me@work.com'
export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"

.bashrc: theo dõi tệp này, làm cho nó giống nhau trên cả máy tính làm việc và gia đình:

F="$HOME/.bashrc_local"
if [ -r "$F" ]; then
    . "$F"
fi

Tôi đang sử dụng https://github.com/technicalpickles/homesick để đồng bộ hóa các dotfiles của mình.

Nếu chỉ gitconfig sẽ chấp nhận các biến môi trường: Mở rộng biến Shell trong git config


5

Môi trường Windows

Bổ sung này có thể được sửa đổi từ Git Extensions --> Settings --> Global Settings, nếu bạn đã cài đặt nó trong hệ thống của bạn.

gitextensions-mới nhất phát hành

Nhấp chuột phải vào thư mục / thư mục trong Môi trường Windows để truy cập các cài đặt này. nhập mô tả hình ảnh ở đây

Cập nhật : Cách chuyển đổi / duy trì nhiều cài đặt trong Phiên bản 2.49 Cách chuyển đổi / duy trì nhiều cài đặt trong Phiên bản 2.49


Làm thế nào để giải quyết nhiều người dùng, thay vì chỉ chỉnh sửa chúng?

@D_N Cập nhật với ảnh chụp màn hình mới với các tùy chọn để chuyển cài đặt.
Abhijeet

Mở thư mục repo cục bộ và chọn git-config từ menu điều hướng, sau đó nhấp vào tab repo cục bộ, nội dung sẽ được áp dụng cho $ local_Vpo_path / .git / config như câu trả lời ở trên.
maxwu

3

Có thể nó là một hack đơn giản, nhưng nó rất hữu ích. Chỉ cần tạo 2 phím ssh như bên dưới.

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/GowthamSai/.ssh/id_rsa): work
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in damsn.
Your public key has been saved in damsn.pub.
The key fingerprint is:
SHA256:CrsKDJWVVek5GTCqmq8/8RnwvAo1G6UOmQFbzddcoAY GowthamSai@Gowtham-MacBook-Air.local
The key's randomart image is:
+---[RSA 4096]----+
|. .oEo+=o+.      |
|.o o+o.o=        |
|o o o.o. +       |
| =.+ .  =        |
|= *+.   S.       |
|o*.++o .         |
|=.oo.+.          |
| +. +.           |
|.o=+.            |
+----[SHA256]-----+

Cùng một cách tạo thêm một cho cá nhân. Vì vậy, bạn có 2 khóa ssh, công việc và công ty. Sao chép work.pub, work, Personal.pub, cá nhân vào ~ / .ssh / Directory.

Sau đó, tạo một tập lệnh shell với các dòng sau và đặt tên là crev.sh (Company Reverse) với nội dung sau.

cp ~/.ssh/work ~/.ssh/id_rsa
cp ~/.ssh/work.pub ~/.ssh/id_rsa.pub

Tương tự, tạo thêm một cái gọi là trước.sh (Đảo ngược cá nhân) với nội dung sau.

cp ~/.ssh/personal ~/.ssh/id_rsa
cp ~/.ssh/personal.pub ~/.ssh/id_rsa.pub

trong ~ / .bashrc thêm bí danh cho các tập lệnh như bên dưới

alias crev="sh ~/.ssh/crev.sh"
alias prev="sh ~/.ssh/prev.sh"
source ~/.bashrc

Bất cứ khi nào bạn muốn sử dụng công ty, chỉ cần làm crev, và nếu bạn muốn sử dụng cá nhân hãy làm trước :-p.

Thêm các khóa ssh đó vào tài khoản GitHub của bạn. Hãy chắc chắn rằng bạn không có id_rsa được tạo trước đó, vì các tập lệnh đó sẽ ghi đè lên id_rsa. Nếu bạn đã tạo id_rsa, hãy sử dụng nó cho một trong các tài khoản. Sao chép chúng dưới dạng cá nhân và bỏ qua việc tạo khóa cá nhân.


1

Tôi đã thực hiện một chức năng bash xử lý đó. Đây là repo Github .

Cho kỷ lục:

# Look for closest .gitconfig file in parent directories
# This file will be used as main .gitconfig file.
function __recursive_gitconfig_git {
    gitconfig_file=$(__recursive_gitconfig_closest)
    if [ "$gitconfig_file" != '' ]; then
        home="$(dirname $gitconfig_file)/"
        HOME=$home /usr/bin/git "$@"
    else
        /usr/bin/git "$@"
    fi
}

# Look for closest .gitconfig file in parents directories
function __recursive_gitconfig_closest {
    slashes=${PWD//[^\/]/}
    directory="$PWD"
    for (( n=${#slashes}; n>0; --n ))
    do
        test -e "$directory/.gitconfig" && echo "$directory/.gitconfig" && return 
        directory="$directory/.."
    done
}


alias git='__recursive_gitconfig_git'

1

Chỉ cần thêm phần này vào ~ / .bash_profile để chuyển giữa các khóa mặc định cho github.com

# Git SSH keys swap
alias work_git="ssh-add -D  && ssh-add -K ~/.ssh/id_rsa_work"
alias personal_git="ssh-add -D && ssh-add -K ~/.ssh/id_rsa"

1

Bạn cũng có thể sử dụng git commit --author "Your Name <your@email.com>"tại thời điểm thực hiện một cam kết trong một repo nơi bạn muốn cam kết là một người dùng khác.


0

Một cái gì đó giống như câu trả lời của Rob W , nhưng cho phép khóa ssh khác nhau và hoạt động với các phiên bản git cũ hơn (không có cấu hình core.sshCommand).

Tôi đã tạo tệp ~/bin/git_poweruser, với sự cho phép thực thi và trong PATH:

#!/bin/bash

TMPDIR=$(mktemp -d)
trap 'rm -rf "$TMPDIR"' EXIT

cat > $TMPDIR/ssh << 'EOF'
#!/bin/bash
ssh -i $HOME/.ssh/poweruserprivatekey $@
EOF

chmod +x $TMPDIR/ssh
export GIT_SSH=$TMPDIR/ssh

git -c user.name="Power User name" -c user.email="power@user.email" $@

Bất cứ khi nào tôi muốn cam kết hoặc đẩy một cái gì đó là "Người dùng quyền lực", tôi sử dụng git_poweruserthay vì git. Nó nên hoạt động trên bất kỳ thư mục nào và không yêu cầu thay đổi trong .gitconfighoặc .ssh/config, ít nhất là không phải trong thư mục của tôi.


0

Mặc dù hầu hết các câu hỏi đã trả lời OP, tôi chỉ phải tự mình trải qua điều này và thậm chí không cần phải loay hoay, tôi đã có thể tìm ra giải pháp nhanh nhất và đơn giản nhất. Đây là các bước đơn giản:

  • sao chép .gitconfgtừ repo khác của bạn
  • dán vào repo mới thêm của bạn
  • thay đổi giá trị trong .gitconfigtệp, chẳng hạn như tên, email và tên người dùng [user] name = John email = john@email.net username = john133
  • thêm tên tệp vào .gitignoredanh sách, để đảm bảo bạn không cam kết .gitconfigtập tin vào repo công việc của bạn
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.