Come dire a git di usare l'identità corretta (nome ed email) per un dato progetto?


117

Uso il mio laptop personale sia per il lavoro che per i progetti personali e vorrei usare il mio indirizzo email di lavoro per i miei impegni sul lavoro (gitolite) e il mio indirizzo email personale per il resto (github).

Ho letto delle seguenti soluzioni che sono tutte globali o temporanee:

  • git config --global user.email "bob@example.com"
  • git config user.email "bob@example.com"
  • git commit --author "Bob <bob@example.com>"
  • impostare uno dei GIT_AUTHOR_EMAIL, GIT_COMMITTER_EMAILo di EMAILvariabili d'ambiente

Una soluzione è eseguire manualmente una funzione di shell che imposta il mio ambiente in modo che funzioni o sia personale , ma sono abbastanza sicuro che dimenticherò spesso di passare all'identità corretta con il risultato di eseguire il commit con l'identità sbagliata.

Esiste un modo per associare un determinato repository, nome di progetto, ecc. A un'identità (nome, e-mail)? Cosa fanno le persone?


1
Ti chiedo di accettare una delle risposte. Spero che uno di loro ti abbia aiutato a risolvere il tuo problema.
RBT

Risposte:


134

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

Farlo all'interno di un repository imposterà la configurazione su QUEL repository e non a livello globale.

Sembra che sia più o meno quello che stai cercando, a meno che non ti stia interpretando male.


Immagino che dovrebbe bastare. Mi aspetto di avere più repository locali per lo stesso progetto, in particolare per passare da un ramo all'altro più facilmente senza dover ricompilare tutto. Forse è solo una cattiva abitudine di svn. Grazie.
Martin Jambon

1
@ Martin - Non utilizzo git da molto tempo, ma la sensazione che ho è che l'utilizzo di più repository locali sarebbe un flusso di lavoro insolito per git. Anche così, dovresti eseguirlo solo una volta su un'istanza del repository, ed è impostato per la durata di quel repository, quindi non è così male.
Dan Ray

@DanRay In effetti è una configurazione comune se, come nel caso di Martin, il repository locale ha file locali non salvati. Il passaggio da un ramo all'altro non ricostruirà automaticamente i file. Se evitare di "ricompilare tutto" è un obiettivo, utilizzare più repository locali è il modo corretto per farlo.
dolmen

1
git config --global user.email "bob@example.com" L'aggiunta di --global lo fa funzionare su tutti i repository. fonte: help.github.com/articles/setting-your-username-in-git
SashiOno

1
Questa è un'attività manuale e può essere dimenticata. Le soluzioni automatiche sono suggerite da me e @ dragon788
naitsirch

47

È necessario utilizzare il comando set locale di seguito:

set locale

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

get locale

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

Il file di configurazione locale è nella directory del progetto: .git/config.

set globale

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

get globale

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

Il file di configurazione globale nella vostra home directory: ~/.gitconfig.

Ricorda di citare spazi vuoti, ecc., Ad esempio: "Nome Cognome"


23

Modificare il file di configurazione con nella cartella ".git" per mantenere il nome utente e l'email diversi a seconda del repository

  • Vai al tuo repository
  • Mostra i file nascosti e vai alla cartella ".git"
  • Trova il file "config"
  • Aggiungi le seguenti righe a EOF

[utente]

nome = Bob

email = bob@example.com

Il comando seguente mostra quale nome utente e indirizzo email sono impostati per questo repository.

git config --get user.name

git config --get user.email

Esempio: per il mio quel file di configurazione in D: \ workspace \ eclipse \ ipchat \ .git \ config

Qui ipchat è il nome del mio repo


16

Se lo usi git config user.email "foo@example.com"sarà vincolato al progetto corrente in cui ti trovi.

Questo è quello che faccio per i miei progetti. Ho impostato l'identità appropriata quando clone / inizio il repository. Non è infallibile (se dimentichi e spingi prima di capirlo, sei imbrogliato) ma è quanto di meglio puoi ottenere senza la capacità di diregit config --global user.email 'ILLEGAL_VALUE'

In realtà, puoi creare un valore illegale. Imposta il tuogit config --global user.name $(perl -e 'print "x"x968;')

Quindi se dimentichi di impostare i tuoi valori non globali riceverai un messaggio di errore.

[EDIT] Su un sistema diverso ho dovuto aumentare il numero di x a 968 per farlo fallire con "fatale: identificatore personale impossibile lungo". Stessa versione di git. Strano.


Sembra un grande trucco ma non ha funzionato per me. Sia il commit che il push a gitolite remote hanno avuto successo.
Martin Jambon

@ Martin Jambon: Strano. Sto usando git versione 1.7.4.5
Seth Robertson

@Martin Jambon: Puoi anche provare a impostare il tuo nome utente / indirizzo email globale su "x". Alcune versioni precedenti di git rifiutavano valori troppo piccoli. Segnala quale versione / sistema operativo di git hai se questo non funziona.
Seth Robertson

@ Martin Jambon: prova 968 "x" e vedi se funziona meglio per te.
Seth Robertson

8

Se non si utilizza il --globalparametro, verranno impostate le variabili solo per il progetto corrente.


8

A partire da Git 2.13 puoi usare un includeIfnel tuo gitconfig per includere un file con una configurazione diversa in base al percorso del repository in cui stai eseguendo i tuoi comandi git.

Dal momento che un Git abbastanza nuovo viene fornito con Ubuntu 18.04, l'ho usato ~/.gitconfigabbastanza felicemente.

[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

Per usare Git 2.13 dovrai aggiungere un PPA (Ubuntu precedente alla 18.04 / Debian) o scaricare i binari e installarli (Windows / altro Linux).


Molto utile ed esattamente quello che stavo cercando. In combinazione con git config core.sshCommandpiù chiavi private, offre una gestione completa delle identità git senza interruzioni.
fino

0

Una soluzione è eseguire manualmente una funzione di shell che imposta il mio ambiente in modo che funzioni o sia personale, ma sono abbastanza sicuro che dimenticherò spesso di passare all'identità corretta con il risultato di eseguire il commit con l'identità sbagliata.

Quello era esattamente il mio problema. Ho scritto uno script hook che ti avverte se hai un github remoto e non hai definito un nome utente locale.

Ecco come lo configuri:

  1. Crea una directory per contenere l'hook globale

    mkdir -p ~/.git-templates/hooks

  2. Di 'a git di copiare tutto nella directory ~/.git-templatesper progetto .gitquando esegui git init o clone

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

  3. E ora copia le seguenti righe ~/.git-templates/hooks/pre-commite rendi il file eseguibile (non dimenticarlo altrimenti git non lo eseguirà!)

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

Se usi altri host per i tuoi repository privati ​​devi sostituirli in github.combase alle tue esigenze.

Ora ogni volta che esegui un git inito git clonegit copierà questo script nel repository e lo eseguirà prima che venga eseguito qualsiasi commit. Se non hai impostato un nome utente locale, verrà emesso un avviso e non ti consentirà di eseguire il commit.


0

Mi piace molto il modo di Micah Henning nel suo articolo (vedi Setting Up Git Identities ) su questo argomento. Il fatto che applichi e forzi l'identità a ogni repository creato / clonato è un buon modo per non dimenticare di configurarlo ogni volta.

Configurazione git di base

Annulla l'impostazione della configurazione dell'utente corrente in git:

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

Forza la configurazione dell'identità su ogni nuovo repository locale:

$ git config --global user.useConfigOnly true

Crea alias Git per il identitycomando, useremo in seguito:

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

Creazione di identità

Crea un'identità con GPG (usa gpgo a gpg2seconda di ciò che hai sul tuo sistema). Ripeti i passaggi successivi per ogni identità che desideri utilizzare.

Nota: [keyid]ecco l' identificativo della chiave segreta creata. Esempio qui:

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]

La 8A5C011E4CE081A5parte dopo sec rsa4096/è l' identificativo della chiave.

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

Copia il blocco chiave pubblica e aggiungilo alle tue impostazioni GitHub / GitProviderOfChoice come chiave GPG.

Aggiungi identità a Git config. Ripeti anche questo per ogni identità che desideri aggiungere:

Nota: Qui uso gitlabper chiamare la mia identità, ma dalla tua domanda può essere qualsiasi cosa, ad esempio: gitoliteo github, workecc

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

Configura l'identità per un repository

Se un nuovo repository non ha un'identità associata, apparirà un errore sul commit, ricordando di impostarlo.

*** Please tell me who you are.

## parts of message skipped ##

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

Specifica l'identità che desideri su un nuovo repository:

$ git identity gitlab

Ora sei pronto per eseguire il commit con l' identità gitlab .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.