Bisakah saya menentukan beberapa pengguna untuk saya sendiri di .gitconfig?

755

Di saya ~/.gitconfig, saya mencantumkan alamat email pribadi saya di bawah [user], karena itulah yang ingin saya gunakan untuk repo Github.

Tapi, saya baru-baru ini mulai menggunakan git untuk bekerja juga. Repositori git perusahaan saya memungkinkan saya untuk melakukan, tetapi ketika mengirimkan pengumuman perubahan baru, ia mengatakan itu berasal dari Anonim karena tidak mengenali alamat email di saya .gitconfig- setidaknya, itulah teori saya.

Apakah mungkin untuk menentukan beberapa [user]definisi di .gitconfig? Atau ada cara lain untuk mengganti default .gitconfiguntuk direktori tertentu? Dalam kasus saya, saya memeriksa semua kode kerja ~/worksrc/- apakah ada cara untuk menentukan .gitconfighanya direktori itu (dan subdirektori)?

Brock Boland
sumber
Lihat git-config # FILES .
Josh Lee
1
Saya terkejut bahwa server perusahaan Anda akan melakukan itu - itu harus MENGUBAH sha dari komitmen Anda untuk itu untuk bekerja. Jika Anda berkomitmen pada checkout lokal, nama pengguna apa yang Anda lihat?
Alex Brown
1
@Alex: Lupa bit penting di sana - itu bisa dengan mudah menjadi nama di notifikasi email, tidak benar-benar mengubah apa pun di komit.
Cascabel
1
Anda dapat menggunakan git-hook untuk mengotomatiskan pekerjaan berulang ini: github.com/DrVanScott/git-clone-init
Henning
1
Harap terima jawaban ini: stackoverflow.com/a/43654115/482899 . Ini solusi terbaik sejak git 2.13.
northtree

Jawaban:

1017

Anda dapat mengonfigurasi repo individual untuk menggunakan pengguna / alamat email tertentu yang mengesampingkan konfigurasi global. Dari akar repo, jalankan

git config user.name "Your Name Here"
git config user.email [email protected]

sedangkan pengguna / email default dikonfigurasi di ~ / .gitconfig Anda

git config --global user.name "Your Name Here"
git config --global user.email [email protected]
discomurray
sumber
83
Anda dapat melihat efek dari pengaturan ini dalam .git/configfile
Abizern
21
Anda dapat secara manual mengedit file konfigurasi dengan git config --editdan git config --global --edit. Dan jika Anda melewatkan komentar Abizern , file konfigurasi repositori ada di <repo-root>/.git/config.
Rory O'Kane
13
Anda juga harus menghapus GIT_AUTHOR_EMAIL dan GIT_COMMITTER_EMAIL (dan * _NAME) karena akan mengesampingkan pengaturan lokal
ACyclic
6
Apakah ada cara untuk melakukan ini untuk semua repo di folder yang diberikan, daripada untuk repo individual? Lihat pertanyaan saya di sini: stackoverflow.com/questions/21307793/…
scubbo
6
Lihat jawaban di bawah ini untuk solusi terkini dengan Git 2.13rilis hari ini.
tejasbubane
491

Sejak git 2.13 , dimungkinkan untuk menyelesaikan ini dengan menggunakan Conditional include yang baru diperkenalkan .

Sebuah contoh:

Konfigurasi global ~ / .gitconfig

[user]
    name = John Doe
    email = [email protected]

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

Konfigurasi khusus ~ ~ work / .gitconfig

[user]
    email = [email protected]
Tomáš Janoušek
sumber
48
Ini adalah jawaban terbaik sekarang git 2.13 telah dirilis.
tejasbubane
1
Apakah solusi ini berfungsi untuk semua subdirektori dalam yang ditentukan dalam pernyataan include, dengan asumsi mereka tidak memiliki file .gitconfig sendiri? Saya akan berpikir begitu, tetapi sejauh ini pengujian belum membuktikan hal ini.
Gary
2
@Gary Ya, menurut pengalaman saya dan dokumen: “Jika pola diakhiri dengan /, ** akan ditambahkan secara otomatis. Misalnya, pola foo / menjadi foo / **. Dengan kata lain, itu cocok dengan "foo" dan semua yang ada di dalamnya, secara rekursif. ","; termasuk untuk semua repositori dalam $ HOME / to / group [includeIf "gitdir: ~ / to / group /"] ”
Tomáš Janoušek
6
The gitdir harus mencakup yang terakhir '/'.
Chris Yim
5
Anda dapat memeriksa apakah itu bekerja secara rekursif dengan menjalankan git config --listdirektori yang berbeda. Dalam subdirektori ~/work/yang berisi repositori git, includeIfefeknya berlaku. Perhatikan bahwa dalam subdirektori ~/work/yang tidak mengandung repositori git, includeIfitu tidak dijalankan.
NZD
105

Atau Anda dapat menambahkan informasi berikut di .git/configfile lokal Anda

[user]  
    name = Your Name
    email = [email protected]
Rahul Prasad
sumber
27
... yang merupakan cara manual untuk melakukan apa yang direkomendasikan oleh @discomurray untuk Anda.
user456584
1
apakah mungkin menambahkan beberapa baris per remote ini?
Abel Callejo
55

Satu perintah beralih akun github

Solusi ini mengambil bentuk alias git tunggal. Setelah dieksekusi, pengguna proyek saat ini akan dilampirkan ke akun lain

Buat kunci ssh

ssh-keygen -t rsa -C "[email protected]" -f '/Users/arnaudrinquin/.ssh/id_rsa'

[...]

ssh-keygen -t rsa -C "[email protected]" -f '/Users/arnaudrinquin/.ssh/id_rsa_pro'

Tautkan ke akun GitHub / Bitbucket Anda

  1. salin kunci publik default pbcopy < ~/.ssh/id_rsa.pub
  2. masuk ke akun GitHub Anda
  3. rekatkan kunci di add SSH keyhalaman github
  4. salin kunci publik lainnya pbcopy < ~/.ssh/id_rsa_pro.pub
  5. ulangi dan sesuaikan langkah 2 hingga 4 untuk setiap akun lainnya

Langkah 1. Pergantian kunci ssh otomatis.

Kami dapat mengonfigurasi sshuntuk mengirim penggunaan kunci enkripsi tertentu tergantung pada host. Yang menyenangkan adalah Anda dapat memiliki beberapa alias untuk hal yang samahostname .

Lihat contoh ~/.ssh/configfile ini:

# 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

git konfigurasi jarak jauh

Anda sekarang dapat menggunakan alias ini di remote git dengan mengubahnya [email protected]dengangit@github_pro .

Anda dapat mengubah remote proyek yang ada (menggunakan sesuatu seperti git remote set-url origin git@github_pro:foo/bar.git ) atau menyesuaikannya secara langsung saat mengkloningnya.

git clone [email protected]:ArnaudRinquin/atom-zentabs.git

menggunakan alias, itu menjadi:

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

Langkah 2. Mengubah git user.email

Pengaturan konfigurasi git dapat bersifat global atau per proyek. Dalam kasus kami, kami menginginkan pengaturan per proyek. Sangat mudah untuk mengubahnya:

git config user.email '[email protected]'

Meskipun ini mudah, perlu waktu lama bagi pengembang kami. Kita dapat menulis alias git yang sangat sederhana untuk itu.

Kami akan menambahkannya ke ~/.gitconfigfile.

[user]
    name = Arnaud Rinquin
    email = [email protected]

...

[alias]
    setpromail = "config user.email '[email protected]'"

Maka, yang harus kita lakukan adalah git setpromail mengubah email kita untuk proyek ini saja.

Langkah 3. Tolong, satu saklar perintah ?!

Bukankah lebih baik untuk beralih dari akun default ke yang ditentukan dengan satu perintah parameter-kurang? Ini pasti mungkin. Perintah ini akan memiliki dua langkah:

  • ubah remote proyek sekarang menjadi alias yang dipilih
  • ubah konfigurasi user.email proyek saat ini

Kami sudah memiliki solusi satu perintah untuk langkah kedua, tetapi yang pertama jauh lebih sulit. Satu perintah perubahan host jarak jauh

Inilah solusinya dalam bentuk perintah alias git lain untuk ditambahkan ke Anda ~/.gitconfig:

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

Ini memungkinkan mengubah semua remote dari satu host ke yang lain (alias). Lihat contohnya:

$ > git remote -v
origin  [email protected]:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  [email protected]: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)

Gabungkan semuanya

Kami sekarang hanya harus menggabungkan dua perintah menjadi satu, ini cukup mudah. Lihat bagaimana saya juga mengintegrasikan switching host 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 '[email protected]'"
  gopro = !sh -c \"git changeremotehost github.com github_pro && git changeremotehost bitbucket.com bitbucket_pro && git setpromail\"

Tautan Sumber -Tutorial

Kaleem Ullah
sumber
Ini brilian, terima kasih. Saya bekerja dengan banyak repo per email sehingga setpromailalias saya melakukanconfig --global sebaliknya (dan saya memiliki alias set lain untuk mengatur alamat email yang berbeda). Berhasil!
michel-slm
1
Untuk 2 akun berbeda itu, bagaimana saya bisa masuk dengan kunci gpg yang berbeda? Saya memiliki kunci 2x gpg untuk akun 2x github dan ingin masuk secara berbeda. "git config --global user.signingkey xxxx"
hakkican
Jawaban ini luar biasa. Saya hampir tidak membacanya karena saya pikir saya menemukan apa dari jawaban yang lain. Jelas layak mendapat lebih banyak upvotes. PS. Bahkan lebih baik bila dikombinasikan dengan useConfigOnly = truedari jawaban yang lain.
steinybot
Bukan IdentifyFile, itu adalah IdenfityFile.
Christian
40

Setelah mendapatkan beberapa inspirasi dari posting blog Orr Sella, saya menulis kait pre-commit (berada di ~/.git/templates/hooks) yang akan menetapkan nama pengguna dan alamat email tertentu berdasarkan informasi di dalam repositori lokal ./.git/config:

Anda harus menempatkan path ke direktori templat ke ~/.gitconfig:

[init]
    templatedir = ~/.git/templates

Kemudian masing git init- masing atau git cloneakan mengambil kait itu dan akan menerapkan data pengguna selama berikutnya git commit. Jika Anda ingin menerapkan hook ke repo yang sudah ada maka jalankan agit init di dalam repo untuk menginisialisasi ulang itu.

Berikut adalah kait yang saya buat (masih perlu dipoles - saran dipersilahkan). Simpan baik sebagai

~/.git/templates/hooks/pre_commit

atau

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

dan pastikan itu dapat dieksekusi: 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

EDIT:

Jadi saya menulis ulang hook sebagai hook dan perintah dengan Python. Selain itu dimungkinkan untuk memanggil skrip sebagai perintah Git ( git passport), juga. Juga dimungkinkan untuk menentukan jumlah ID yang berubah-ubah di dalam configfile ( ~/.gitpassport) yang dapat dipilih pada prompt. Anda dapat menemukan proyek di github.com: git-passport - Perintah dan kait Git yang ditulis dengan Python untuk mengelola beberapa akun Git / identitas pengguna .

Saucier
sumber
1
Ini berfungsi dengan baik. Namun, itu bekerja lebih baik bagi saya dengan menjadikan ini sebagai post-checkout hook (bukan post-commit). Saran saya untuk meningkatkan jawaban ini adalah, sebutkan bahwa: 1. snipet perlu disimpan sebagai ~ / .git / templates / hooks / post-checkout dan diberi izin chmod +x post-checkout, 2. git_remotesnilai adalah bagian awal dari seluruh nama host, misalnya [email protected], 3. local_idnilai harus diedit oleh pengguna ke nama dan alamat email masing-masing.
Shantanu Kumar
@ShantanuKumar Terima kasih atas komentar Anda. Saya menyesuaikan jawaban saat Anda melamar. Mungkin saya akan menulis ulang skrip dengan Python segera.
Saucier
Dukungan tambahan untuk ekspresi reguler dan repositori tanpa remote. Untuk mengunduh dengan mudah, semua digabungkan di sini . Regexps untuk membedakan identitas untuk proyek yang berbeda pada layanan yang sama. Dan mendukung repo jarak jauh dengan misalnya identitas default masuk akal jika Anda git initproyek baru dari IDE seperti eclipse(yang tidak dapat menangani pemicu pra-komit interaktif)
cfi
25

Jika Anda tidak ingin memiliki alamat email default ( tautan alamat email ke pengguna github ), Anda dapat mengonfigurasi bahwa Anda ingin ditanya. Bagaimana Anda bisa melakukannya tergantung pada versi git yang Anda gunakan, lihat di bawah.

Kelemahan (yang dituju) adalah Anda harus mengonfigurasi alamat email Anda (dan nama Anda) satu kali untuk setiap repositori. Jadi, Anda tidak bisa lupa melakukannya.

Versi <2.7.0

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

dalam konfigurasi global Anda ~/.gitconfigsebagaimana dinyatakan dalam komentar oleh Dan Aloni di posting blog Orr Sella . Ketika mencoba melakukan komit pertama di repositori, git gagal dengan pesan yang bagus:

*** Please tell me who you are.

Run

  git config --global user.email "[email protected]"
  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)')

Nama ini diambil dari konfigurasi global ketika alamat email diatur secara lokal (pesannya tidak sepenuhnya akurat).

2.7.0 ≤ Versi <2.8.0

Perilaku dalam versi <2.7.0 tidak dimaksudkan dan diperbaiki dengan 2.7.0. Anda masih dapat menggunakan kait pra-komitmen seperti yang dijelaskan dalam posting blog Orr Sella . Solusi ini juga berfungsi untuk versi lain, tetapi solusi lain tidak untuk versi ini.

Versi ≥ 2.8.0

Dan Aloni menambahkan opsi untuk mencapai perilaku itu (lihat catatan rilis ). Gunakan dengan:

[user]
    useConfigOnly = true

Untuk membuatnya berfungsi, Anda tidak boleh memberikan nama atau alamat email di konfigurasi global. Kemudian, pada komit pertama, Anda mendapatkan pesan kesalahan

fatal: user.useConfigOnly set but no name given

Jadi pesannya tidak terlalu instruktif, tetapi karena Anda menetapkan opsi secara eksplisit, Anda harus tahu apa yang harus dilakukan. Berbeda dengan solusi versi <2.7.0, Anda selalu harus menetapkan nama dan email secara manual.

John
sumber
Saya menggunakan metode ini selama beberapa bulan, ini berhasil dengan baik. Saya memiliki beberapa alamat email (pribadi, kantor) dan saya tidak ingin memiliki "default" yang dikonfigurasi dalam gitconfig global. Dengan nilai khusus "(tidak ada)" git akan meminta saya untuk memberikan alamat yang valid setiap kali saya membuat repo baru, alih-alih menebak satu berdasarkan nama pengguna dan nama host (yang mengganggu dan saya perlu - mengubahnya). Namun, baru-baru ini dengan versi Git yang ditingkatkan (2.7.0, mungkin sebelumnya), saya menemukan bahwa nilai khusus "(tidak ada)" tidak lagi memicu kesalahan fatal. Sebaliknya itu hanya akan menggunakan "John Doe <(tidak ada)>" seperti ...
Zhuoyun Wei
@wzyboy: Oh, kamu benar. Saya dulu git bisectmenemukan bahwa commit 19ce497c ... memperkenalkan perilaku ini. Namun, terlepas dari versi (2.5 - 2.7) saya dapat menggunakan email =(tanpa argumen) di konfigurasi dan itu menunjukkan perilaku yang sama seperti email = "(none)"di versi lama. Bisakah Anda mengkonfirmasi ini? Jika demikian, saya akan mengedit jawaban saya. Saya hanya skeptis karena tampaknya begitu jelas dan saya tidak menggunakannya sebelumnya.
John
Saya mencoba email =di 2.7.0, Git masih menebak-nebak alamat email berdasarkan nama pengguna dan nama host. Saya sekarang menggunakan pre-commitpendekatan di blog Sella. Saya juga memberi tahu Dan Aloni yang muncul dengan "(none)"gagasan di pos Sella dan dia mengajukan tambalan untuk mengimplementasikannya secara formal sebagai fitur: permalink.gmane.org/gmane.comp.version-control.git/285301
Zhuoyun Wei
3
sejak git-2.8: Variabel konfigurasi "user.useConfigOnly" dapat digunakan untuk memaksa pengguna untuk selalu menetapkan user.email & user.name github.com/git/git/blob/master/Documentation/RelNotes/2.8.0. txt
rofrol
@rofrol Terima kasih atas informasinya. Saya memperbarui jawaban saya sesuai.
John
24

Dengan bersyarat termasuk dalam Git 2.13, sekarang dimungkinkan untuk memiliki banyak pengguna / email yang ada pada satu mesin dengan sedikit kerja.

user.gitconfigmemiliki nama dan email pribadi saya. work-user.gitconfigmemiliki nama dan email pekerjaan saya. Kedua file berada di~ jalur.

Jadi nama / email pribadi saya berlaku secara default. Untuk c:/work/dir, nama / email pekerjaan saya diterapkan. Untuk c:/work/github/dir, nama / email pribadi saya diterapkan. Ini berfungsi saat pengaturan terakhir diterapkan.

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

gitdir peka huruf besar-kecil dan gitdir/i case-sensitive.

"gitdir/i:github/"akan menerapkan conditional include untuk direktori apa pun githubyang dilaluinya.

hIpPy
sumber
Sementara jawaban Anda dihargai dan Tomáš Janoušek yang baik memberi 20 hari yang sama sebelum Anda. Harap pertimbangkan untuk menghapus jawaban ini.
Hedge
5
@ Hedges Ya, saya mengubah jawabannya, tetapi butuh beberapa saat untuk mengkonfigurasi pada windows dan di situlah gitdir/imembantu saya (yang jawabannya tidak disebutkan).
hIpPy
Cara khusus @hIpPy menerapkan ini langsung diterapkan pada use case saya dan membuatnya lebih mudah diikuti daripada jawaban Tomas. Saya membatalkan keduanya.
Isaac Adams
18

Opsi lain untuk mulai gitbekerja dengan beberapa nama / email adalah dengan aliasing gitdan menggunakan -cflag untuk mengganti konfigurasi global dan repositori-spesifik.

Misalnya, dengan mendefinisikan alias:

alias git='/usr/bin/git -c user.name="Your name" -c user.email="[email protected]"'

Untuk melihat apakah itu berfungsi, cukup ketik git config user.email:

$ git config user.email
name@example.com

Alih-alih sebuah alias, Anda juga bisa menempatkan custom gitexecutable di dalam $PATH.

#!/bin/sh
/usr/bin/git -c user.name="Your name" -c user.email="[email protected]" "$@"

Keuntungan dari metode ini daripada repositori-spesifik .git/configadalah bahwa ia berlaku untuk setiap gitrepositori ketika gitprogram kustom aktif. Dengan cara ini, Anda dapat dengan mudah beralih di antara pengguna / nama tanpa mengubah konfigurasi (dibagi) apa pun.

Rob W
sumber
14

alias git (dan bagian dalam konfigurasi git) untuk menyelamatkan!

tambahkan alias (dari baris perintah):

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

lalu, atur, misalnya

git config --global user.github.name "your github username"
git config --global user.github.email [email protected]

dan dalam repo baru atau dikloning Anda dapat menjalankan perintah ini:

git identity github

Solusi ini tidak otomatis, tapi unsetting pengguna dan email di Anda global yang ~/.gitconfigdan pengaturan user.useConfigOnlyuntuk trueakan memaksa git untuk mengingatkan Anda untuk mengatur secara manual di setiap repo baru atau kloning.

git config --global --unset user.name
git config --global --unset user.email
git config --global user.useConfigOnly true
codesnik
sumber
1
Saya suka solusi Anda; Namun, ketika saya menghapus global saya itu hanya membuat komit dengan nama host komputer saya daripada meminta git mengingatkan saya untuk mengatur mereka dalam setiap repo yang diberikan :(
ENG618
12

Inilah langkah-langkah lengkap setelah membaca banyak jawaban di sini

Cara mengatur beberapa pengaturan Kunci SSH untuk akun github yang berbeda

Anda mungkin ingin mulai memeriksa kunci yang saat ini disimpan

$ ssh-add -l

Jika Anda memutuskan untuk menghapus semua kunci yang di-cache sebelumnya ( opsional, hati-hati tentang ini )

$ ssh-add -D

Kemudian Anda dapat membuat ssh pub / kunci privat yang ditautkan ke setiap email / akun yang ingin / perlu Anda gunakan

$ cd ~/.ssh
$ ssh-keygen -t rsa -C "[email protected]" <-- save it as "id_rsa_work"
$ ssh-keygen -t rsa -C "[email protected]" <-- save it as "id_rsa_pers"

Setelah melakukan perintah ini, Anda akan membuat file-file berikut

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

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

Pastikan agen otentikasi sedang berjalan

$ eval `ssh-agent -s`

Tambahkan kunci yang dihasilkan sebagai berikut (dari folder ~ / .ssh)

$ ssh-add id_rsa_work
$ ssh-add id_rsa_pers

Sekarang Anda dapat memeriksa kunci yang disimpan lagi

$ ssh-add -l

Sekarang kamu perlu menambahkan kunci publik yang dihasilkan ke server Acces Keys github / bickbuket Anda

Kloning masing-masing repo ke folder yang berbeda

Buka folder tempat pengguna bekerja akan bekerja dan jalankan ini

$ git config user.name "Working Hard"
$ git config user.email "[email protected]" 

Hanya untuk melihat apa yang dilakukannya, periksa isi ".git / config"

Pergi ke folder tempat pers pengguna akan bekerja dan jalankan ini

$ git config user.name "Personal Account"
$ git config user.email "[email protected]" 

Hanya untuk melihat apa yang dilakukannya, periksa isi ".git / config"

Setelah semua ini, Anda akan dapat melakukan kode pribadi dan kerja Anda dengan hanya beralih di antara dua folder itu

Jika Anda menggunakan Git Bash dan perlu membuat kunci ssh di Windows ikuti langkah-langkah ini:

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

Mauricio Gracia Gutierrez
sumber
9

Ada solusi sederhana yang tampaknya bekerja dengan baik untuk menghindari kesalahan.

Cukup hapus [user]bagian dari Anda ~/.gitconfig, yang akan mencegah Anda membuat komitmen tanpa pengaturanuser.name untuk setiap repositori.

Di Anda ~/.bashrc, tambahkan beberapa alias sederhana untuk pengguna dan email:

alias ggmail='git config user.name "My Name";git config user.email [email protected]'
alias gwork='git config user.name "My Name";git config user.email [email protected]'
Zantier
sumber
Tidak hebat karena Anda akan menduplikasi konfigurasi di setiap
repositori
9

Jawaban ini sebagian terinspirasi oleh pos oleh @Saucier, tetapi saya sedang mencari cara otomatis untuk mengatur user.namedan user.emailberdasarkan per repo, berdasarkan pada remote, yang sedikit lebih ringan daripada paket paspor git yang dikembangkannya. . Juga h / t ke @John untuk pengaturan useConfigOnly. Inilah solusi saya:

.gitconfig perubahan:

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

kait pasca checkout yang harus disimpan ke jalur berikut ~/.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

Saya menggunakan kredensial berbeda untuk github dan gitlab, tetapi referensi dalam kode di atas dapat diganti atau ditambah dengan layanan apa pun yang Anda gunakan. Untuk membuat kait pasca-checkout secara otomatis mengatur nama pengguna dan email secara lokal untuk repo setelah checkout memastikan nama layanan muncul di url jarak jauh, tambahkan ke array layanan dalam post-checkoutskrip dan buat bagian untuk itu di Anda .gitconfigyang berisi nama pengguna dan email Anda untuk layanan itu.

Jika tidak ada nama layanan yang muncul di url jarak jauh atau repo tidak memiliki remote, nama pengguna dan email tidak akan ditetapkan secara lokal. Dalam kasus ini, user.useConfigOnlypengaturan akan dimainkan yang tidak memungkinkan Anda membuat komitmen sampai nama pengguna dan email ditetapkan pada level repo, dan akan meminta pengguna untuk mengonfigurasi informasi itu.

Berikan Humphries
sumber
1
Solusi bagus Jangan lupa dengan chmod 755skrip kaitnya. Kalau tidak, itu akan disalin tetapi tidak pernah dieksekusi.
onekiloparsec
5

GIT_AUTHOR_EMAIL + lokal .bashrc

.bashrc_local: jangan lacak file ini, taruh hanya di komputer kantor Anda:

export GIT_AUTHOR_EMAIL='[email protected]'
export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"

.bashrc: lacak file ini, buat hal yang sama di komputer kantor dan di rumah:

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

Saya menggunakan https://github.com/technicalpickles/homesick untuk menyinkronkan dotfiles saya.

Jika hanya gitconfig yang akan menerima variabel lingkungan: Ekspansi variabel shell di git config

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
5

Lingkungan Windows

Tambahan ini dapat dimodifikasi dari Git Extensions --> Settings --> Global Settings , jika Anda menginstalnya di sistem Anda.

gitextensions-latest-release

Klik kanan pada folder / direktori di Lingkungan Windows untuk mengakses pengaturan ini. masukkan deskripsi gambar di sini

Pembaruan : Cara beralih / mempertahankan beberapa pengaturan di Versi 2.49 Bagaimana cara beralih / memelihara beberapa pengaturan di Versi 2.49

Abhijeet
sumber
Bagaimana cara ini mengatasi beberapa pengguna, alih-alih hanya mengeditnya?
@D_N Diperbarui dengan tangkapan layar baru dengan opsi untuk beralih pengaturan.
Abhijeet
Buka folder repo lokal dan pilih git-config dari menu navigasi lalu klik tab repo lokal, isinya akan diterapkan ke $ local_repo_path / .git / config seperti jawaban di atas.
maksimal
3

Mungkin ini adalah hack sederhana, tetapi bermanfaat. Cukup buat 2 kunci ssh seperti di bawah ini.

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 [email protected]
The key's randomart image is:
+---[RSA 4096]----+
|. .oEo+=o+.      |
|.o o+o.o=        |
|o o o.o. +       |
| =.+ .  =        |
|= *+.   S.       |
|o*.++o .         |
|=.oo.+.          |
| +. +.           |
|.o=+.            |
+----[SHA256]-----+

Cara yang sama buat satu lagi untuk pribadi. Jadi, Anda memiliki 2 kunci ssh, kerja dan perusahaan. Salin work.pub, work, personal.pub, personal ke ~ / .ssh / Direktori.

Kemudian buat skrip shell dengan baris berikut dan beri nama crev.sh (Pembalikan Perusahaan) dengan konten berikut.

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

Cara yang sama, buat satu lagi yang disebut prev.sh (Pembalikan Pribadi) dengan konten berikut.

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

di ~ / .bashrc tambahkan alias untuk skrip seperti di bawah ini

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

Setiap kali Anda ingin menggunakan perusahaan, lakukan saja crev, dan jika Anda ingin menggunakan pribadi do prev :-p.

Tambahkan kunci ssh itu ke akun GitHub Anda. Pastikan, Anda tidak memiliki id_rsa yang dihasilkan sebelumnya, karena skrip tersebut akan menimpa id_rsa. Jika Anda telah membuat id_rsa, gunakan itu untuk salah satu akun. Salin sebagai pribadi dan lewati pembuatan kunci pribadi.

7H3 IN5ID3R
sumber
1

Saya membuat fungsi bash yang menangani itu. Ini repo Github .

Sebagai catatan:

# 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'
Arount
sumber
1

Cukup tambahkan ini ke ~ / .bash_profile Anda untuk beralih di antara kunci default untuk 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"
Jason DeBolt
sumber
1

Anda juga dapat menggunakan git commit --author "Your Name <[email protected]>"saat melakukan komit dalam repo di mana Anda ingin komit sebagai pengguna yang berbeda.

szx
sumber
0

Sesuatu seperti jawaban Rob W. , tetapi memungkinkan berbeda kunci ssh yang berbeda, dan bekerja dengan versi git yang lebih lama (yang tidak memiliki mis. Konfigurasi core.sshCommand).

Saya membuat file ~/bin/git_poweruser, dengan izin yang dapat dieksekusi, dan di 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="[email protected]" $@

Setiap kali saya ingin melakukan atau mendorong sesuatu sebagai "Power User", saya menggunakan git_powerusersebagai gantinya git. Ini harus bekerja pada direktori apa pun, dan tidak memerlukan perubahan .gitconfigatau .ssh/config, setidaknya tidak di tambang.

Jellby
sumber
0

Meskipun sebagian besar pertanyaan semacam menjawab OP, saya hanya harus melalui ini sendiri dan bahkan tanpa googling saya dapat menemukan solusi tercepat dan paling sederhana. Inilah langkah-langkah sederhana:

  • salin yang ada .gitconfgdari repo Anda yang lain
  • rekatkan ke repo Anda yang baru ditambahkan
  • ubah nilai dalam .gitconfigfile, seperti nama, email dan nama pengguna [user] name = John email = [email protected] username = john133
  • tambahkan nama file ke .gitignoredaftar, untuk memastikan Anda tidak melakukan .gitconfigfile ke repo kerja Anda
Tatarin
sumber