Bagaimana cara memberi tahu git untuk menggunakan identitas (nama dan email) yang benar untuk proyek tertentu?


117

Saya menggunakan laptop pribadi saya untuk pekerjaan dan proyek pribadi dan saya ingin menggunakan alamat email kantor saya untuk komitmen saya di tempat kerja (gitolite) dan alamat email pribadi saya untuk sisanya (github).

Saya membaca tentang solusi berikut yang semuanya bersifat global atau sementara:

  • git config --global user.email "bob@example.com"
  • git config user.email "bob@example.com"
  • git commit --author "Bob <bob@example.com>"
  • pengaturan salah satu GIT_AUTHOR_EMAIL, GIT_COMMITTER_EMAILatau EMAILvariabel lingkungan

Salah satu solusinya adalah menjalankan fungsi shell secara manual yang mengatur lingkungan saya untuk bekerja atau pribadi , tetapi saya cukup yakin bahwa saya akan sering lupa untuk beralih ke identitas yang benar sehingga membuat saya melakukan dengan identitas yang salah.

Apakah ada cara untuk mengikat repositori tertentu, nama proyek, dll. Ke identitas (nama, email)? Apa yang orang-orang lakukan?


1
Saya meminta Anda untuk menerima salah satu jawaban. Saya harap salah satu dari mereka pasti membantu Anda menyelesaikan masalah Anda.
NSP

Jawaban:


134

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

Melakukan itu di dalam repo akan mengatur konfigurasi pada repo ITU, dan tidak secara global.

Sepertinya itulah yang Anda cari, kecuali saya salah paham.


Saya rasa itu harus dilakukan. Saya berharap memiliki banyak repositori lokal untuk proyek yang sama, terutama untuk beralih antar cabang dengan lebih mudah tanpa harus mengkompilasi ulang semuanya. Mungkin itu hanya kebiasaan svn yang buruk. Terima kasih.
Martin Jambon

1
@ Martin - Saya belum lama menggunakan git, tetapi kesan yang saya dapatkan adalah bahwa menggunakan beberapa repo lokal akan menjadi alur kerja yang tidak biasa untuk git. Meski begitu, Anda hanya perlu menjalankan ini satu kali pada instance repo, dan ini sudah diatur untuk masa pakai repo itu, jadi tidak terlalu buruk.
Dan Ray

@DanRay Sebenarnya ini adalah pengaturan umum jika, seperti dalam kasus Martin, repo lokal memiliki file lokal yang tidak terikat. Berpindah dari satu cabang ke cabang lain tidak akan secara otomatis membangun kembali file. Jika menghindari "untuk mengkompilasi ulang semuanya" adalah suatu tujuan, menggunakan beberapa repo lokal adalah cara yang benar untuk melakukannya.
dolmen

1
git config --global user.email "bob@example.com" Menambahkan --global membuatnya berfungsi di semua repo. sumber: help.github.com/articles/setting-your-username-in-git
SashiOno

1
Ini adalah tugas manual dan mungkin dilupakan. Solusi otomatis disarankan oleh @ dragon788 dan saya
naitsirch

47

Anda perlu menggunakan perintah set lokal di bawah ini:

set lokal

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

mendapatkan lokal

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

File konfigurasi lokal dalam direktori proyek: .git/config.

set global

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

mendapatkan global

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

File konfigurasi global di dalam direktori home Anda: ~/.gitconfig .

Ingatlah untuk mengutip kosong, dll, misalnya: 'FirstName LastName'


23

Edit file konfigurasi dengan dalam folder ".git" untuk mempertahankan nama pengguna dan email yang berbeda tergantung pada repositori

  • Buka Repositori Anda
  • Tampilkan file yang tersembunyi dan masuk ke folder ".git"
  • Temukan file "config"
  • Tambahkan baris di bawah ini di EOF

[pengguna]

name = Bob

email = bob@example.com

Perintah di bawah ini menunjukkan kepada Anda nama pengguna dan email mana yang disetel untuk repositori ini.

git config --get user.name

git config --get user.email

Contoh: untuk saya yang file konfigurasi di D: \ workspace \ eclipse \ ipchat \ .git \ config

Di sini ipchat adalah nama repo saya


16

Jika Anda menggunakan git config user.email "foo@example.com" itu akan terikat ke proyek Anda saat ini.

Itulah yang saya lakukan untuk proyek saya. Saya menetapkan identitas yang sesuai saat saya mengkloning / menginit repo. Ini bukan bukti yang bodoh (jika Anda lupa dan mendorong sebelum Anda mengetahuinya, Anda disemprot) tetapi ini sebaik yang Anda bisa dapatkan tanpa kemampuan untuk mengatakangit config --global user.email 'ILLEGAL_VALUE'

Sebenarnya, Anda bisa membuat nilai ilegal. Aturgit config --global user.name $(perl -e 'print "x"x968;')

Kemudian jika Anda lupa menyetel nilai non-global Anda, Anda akan mendapatkan pesan kesalahan.

[EDIT] Pada sistem yang berbeda saya harus meningkatkan jumlah x menjadi 968 untuk membuatnya gagal dengan "fatal: Pengenal pribadi yang sangat panjang". Versi git yang sama. Aneh.


Kedengarannya seperti trik yang bagus tetapi tidak berhasil untuk saya. Baik commit dan push ke gitolite remote berhasil.
Martin Jambon

@ Martin Jambon: Aneh. Saya menggunakan git versi 1.7.4.5
Seth Robertson

@Martin Jambon: Anda juga dapat mencoba menyetel nama pengguna / alamat email global Anda ke "x". Beberapa versi git yang lebih lama menolak nilai yang terlalu kecil. Laporkan versi git / os yang Anda miliki jika ini tidak berhasil.
Seth Robertson

@ Martin Jambon: Coba 968 "x" dan lihat apakah itu bekerja lebih baik untuk Anda.
Seth Robertson

8

Jika Anda tidak menggunakan --globalparameter, itu akan mengatur variabel hanya untuk proyek saat ini.


8

Mulai Git 2.13, Anda dapat menggunakan sebuah includeIfdi gitconfig Anda untuk menyertakan file dengan konfigurasi berbeda berdasarkan jalur repositori tempat Anda menjalankan perintah git.

Sejak Git yang cukup baru hadir dengan Ubuntu 18.04, saya telah menggunakan ini dengan ~/.gitconfigcukup senang.

[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

Untuk menggunakan Git 2.13 Anda perlu menambahkan PPA (Ubuntu lebih lama dari 18.04 / Debian) atau mengunduh binari dan menginstal (Windows / Linux lainnya).


Sangat membantu dan persis apa yang saya cari. Dikombinasikan dengan git config core.sshCommanduntuk beberapa kunci pribadi, memberikan manajemen identitas git tanpa batas yang lengkap.
topr

0

Salah satu solusinya adalah menjalankan fungsi shell secara manual yang mengatur lingkungan saya untuk bekerja atau pribadi, tetapi saya cukup yakin bahwa saya akan sering lupa untuk beralih ke identitas yang benar yang mengakibatkan melakukan dengan identitas yang salah.

Itulah tepatnya masalah saya. Saya telah menulis skrip hook yang memperingatkan Anda jika Anda memiliki remote github dan tidak menetapkan nama pengguna lokal.

Berikut cara Anda menyiapkannya:

  1. Buat direktori untuk menahan pengait global

    mkdir -p ~/.git-templates/hooks

  2. Beri tahu git untuk menyalin semuanya ~/.git-templateske .gitdirektori per proyek saat Anda menjalankan git init atau clone

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

  3. Dan sekarang salin baris berikut ke ~/.git-templates/hooks/pre-commitdan buat file tersebut dapat dieksekusi (jangan lupa ini jika tidak git tidak akan menjalankannya!)

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

Jika Anda menggunakan host lain untuk repositori pribadi Anda, Anda harus mengganti github.comsesuai dengan kebutuhan Anda.

Sekarang setiap kali Anda melakukan git initatau git clonegit akan menyalin skrip ini ke repositori dan mengeksekusinya sebelum komit apa pun dilakukan. Jika Anda belum menyetel nama pengguna lokal, itu akan mengeluarkan peringatan dan tidak akan membiarkan Anda berkomitmen.


0

Saya sangat menyukai cara Micah Henning dalam artikelnya (lihat Menyiapkan Identitas Git ) tentang subjek ini. Fakta bahwa ia menerapkan dan memaksa identitas ke setiap repositori yang dibuat / dikloning adalah cara yang baik untuk tidak lupa menyiapkannya setiap saat.

Konfigurasi git dasar

Batalkan pengaturan konfigurasi pengguna saat ini di git:

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

Paksa konfigurasi identitas pada setiap repositori lokal baru:

$ git config --global user.useConfigOnly true

Buat alias Git untuk identityperintah, kita akan gunakan nanti:

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

Penciptaan identitas

Buat identitas dengan GPG (gunakan gpgatau gpg2bergantung pada apa yang Anda dapatkan di sistem Anda). Ulangi langkah selanjutnya untuk setiap identitas yang ingin Anda gunakan.

Catatan: [keyid]berikut adalah pengenal dari kunci rahasia yang dibuat. Contoh di sini:

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]

Bagian 8A5C011E4CE081A5setelahnya sec rsa4096/adalah pengenal kunci.

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

Salin blok kunci publik dan tambahkan ke setelan GitHub / GitProviderOfChoice Anda sebagai kunci GPG.

Tambahkan identitas ke konfigurasi Git. Ulangi juga ini untuk setiap identitas yang ingin Anda tambahkan:

Catatan: di sini saya menggunakan gitlabuntuk nama identitas saya, tapi dari pertanyaan Anda itu bisa apa saja, ex: gitoliteatau github, workdll

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

Siapkan identitas untuk repositori

Jika repo baru tidak memiliki identitas terkait, kesalahan akan muncul saat komit, mengingatkan Anda untuk menyetelnya.

*** Please tell me who you are.

## parts of message skipped ##

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

Tentukan identitas yang Anda inginkan pada repositori baru:

$ git identity gitlab

Anda sekarang siap untuk berkomitmen dengan identitas gitlab .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.