Wie kann ich git anweisen, die richtige Identität (Name und E-Mail-Adresse) für ein bestimmtes Projekt zu verwenden?


117

Ich benutze meinen persönlichen Laptop sowohl für geschäftliche als auch für private Projekte und möchte meine geschäftliche E-Mail-Adresse für meine Verpflichtungen bei der Arbeit (gitolite) und meine persönliche E-Mail-Adresse für den Rest (github) verwenden.

Ich habe über die folgenden Lösungen gelesen, die alle entweder global oder temporär sind:

  • git config --global user.email "bob@example.com"
  • git config user.email "bob@example.com"
  • git commit --author "Bob <bob@example.com>"
  • Einstellung einer der GIT_AUTHOR_EMAIL, GIT_COMMITTER_EMAILoder EMAILUmgebungsvariablen

Eine Lösung besteht darin, eine Shell-Funktion manuell auszuführen, mit der meine Umgebung auf Arbeit oder Privat eingestellt wird. Ich bin mir jedoch ziemlich sicher, dass ich häufig vergessen werde, zur richtigen Identität zu wechseln, was dazu führt, dass die falsche Identität festgelegt wird.

Gibt es eine Möglichkeit, ein bestimmtes Repository, einen Projektnamen usw. an eine Identität (Name, E-Mail) zu binden? Was machen Leute?


1
Ich bitte Sie, eine der Antworten zu akzeptieren. Ich hoffe, einer von ihnen hat Ihnen geholfen, Ihr Problem zu lösen.
RBT

Antworten:


134

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

Wenn Sie dies in einem Repo tun, wird die Konfiguration auf DIESEM Repo und nicht global festgelegt.

Scheint so, als ob Sie danach suchen, es sei denn, ich verstehe Sie falsch.


Ich denke das sollte es tun. Ich erwarte mehrere lokale Repositorys für dasselbe Projekt, insbesondere um einfacher zwischen Zweigen wechseln zu können, ohne alles neu kompilieren zu müssen. Vielleicht ist es nur eine schlechte SVN-Angewohnheit. Vielen Dank.
Martin Jambon

1
@ Martin - Ich benutze Git noch nicht lange, aber ich habe das Gefühl, dass die Verwendung mehrerer lokaler Repos ein ungewöhnlicher Workflow für Git wäre. Trotzdem müssten Sie dies nur einmal auf einer Instanz des Repos ausführen, und es ist auf die Lebensdauer dieses Repos eingestellt, also ist es nicht so schlimm.
Dan Ray

@DanRay Es ist in der Tat eine übliche Einrichtung, wenn das lokale Repo wie im Fall Martin lokale nicht festgeschriebene Dateien enthält. Das Wechseln von einem Zweig zu einem anderen würde Dateien nicht automatisch neu erstellen. Wenn das Vermeiden von "alles neu kompilieren" ein Ziel ist, ist die Verwendung mehrerer lokaler Repos der richtige Weg, dies zu tun.
Dolmen

1
git config --global user.email "bob@example.com" Durch Hinzufügen von --global funktioniert es in allen Repos. Quelle: help.github.com/articles/setting-your-username-in-git
SashiOno

1
Dies ist eine manuelle Aufgabe und kann vergessen werden. Automatische Lösungen werden von @ dragon788 und mir vorgeschlagen
naitsirch

46

Sie müssen den folgenden lokalen Befehl set verwenden :

lokaler Satz

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

lokal bekommen

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

Die lokale Konfigurationsdatei befindet sich im Projektverzeichnis : .git/config.

globale Menge

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

global bekommen

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

Die globale Konfigurationsdatei in Ihrem Home-Verzeichnis : ~/.gitconfig.

Denken Sie daran, Leerzeichen usw. zu zitieren, zum Beispiel: 'Vorname Nachname'


23

Bearbeiten Sie die Konfigurationsdatei mit im Ordner ".git", um den unterschiedlichen Benutzernamen und die E-Mail-Adresse abhängig vom Repository beizubehalten

  • Gehen Sie zu Ihrem Repository
  • Zeigen Sie die versteckten Dateien an und gehen Sie zum Ordner ".git"
  • Suchen Sie die "config" -Datei
  • Fügen Sie die folgenden Zeilen bei EOF hinzu

[Benutzer]

Name = Bob

email = bob@example.com

Der folgende Befehl zeigt Ihnen, welcher Benutzername und welche E-Mail-Adresse für dieses Repository festgelegt wurden.

git config --get user.name

git config --get user.email

Beispiel: Für meine Konfigurationsdatei in D: \ workspace \ eclipse \ ipchat \ .git \ config

Hier ist ipchat mein Reponame


16

Wenn Sie es verwenden git config user.email "foo@example.com", wird es an das aktuelle Projekt gebunden, in dem Sie sich befinden.

Das mache ich für meine Projekte. Ich stelle die entsprechende Identität ein, wenn ich das Repo klone / initiiere. Es ist nicht narrensicher (wenn Sie vergessen und drücken, bevor Sie herausfinden, dass Sie abgespritzt sind), aber es ist ungefähr so ​​gut, wie Sie es ohne die Fähigkeit zu sagen bekommen könnengit config --global user.email 'ILLEGAL_VALUE'

Eigentlich können Sie einen illegalen Wert machen. Setze deinegit config --global user.name $(perl -e 'print "x"x968;')

Wenn Sie dann vergessen, Ihre nicht globalen Werte festzulegen, wird eine Fehlermeldung angezeigt.

[BEARBEITEN] Auf einem anderen System musste ich die Anzahl von x auf 968 erhöhen, damit es mit "fatal: Unmöglich lange persönliche Kennung" fehlschlug. Gleiche Version von git. Seltsam.


Es klingt nach einem großartigen Trick, hat aber bei mir nicht funktioniert. Sowohl Commit als auch Push to Gitolite Remote waren erfolgreich.
Martin Jambon

@ Martin Jambon: Seltsam. Ich benutze Git Version 1.7.4.5
Seth Robertson

@ Martin Jambon: Sie können auch versuchen, Ihren globalen Benutzernamen / Ihre E-Mail-Adresse auf "x" zu setzen. Einige ältere Versionen von git lehnten zu kleine Werte ab. Berichten Sie, welche Git-Version / Betriebssysteme Sie haben, wenn dies nicht funktioniert.
Seth Robertson

@ Martin Jambon: Versuchen Sie 968 "x" und sehen Sie, ob das für Sie besser funktioniert.
Seth Robertson

8

Wenn Sie den --globalParameter nicht verwenden , werden die Variablen nur für das aktuelle Projekt festgelegt.


8

Ab Git 2.13 können Sie eine includeIfin Ihrer gitconfig verwenden, um eine Datei mit einer anderen Konfiguration einzuschließen, die auf dem Pfad des Repositorys basiert, in dem Sie Ihre git-Befehle ausführen.

Da mit Ubuntu 18.04 ein ausreichend neuer Git geliefert wird, verwende ich diesen in meinem ~/.gitconfigziemlich glücklich.

[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

Um Git 2.13 verwenden zu können, müssen Sie entweder eine PPA hinzufügen (Ubuntu älter als 18.04 / Debian) oder die Binärdateien herunterladen und installieren (Windows / anderes Linux).


Sehr hilfreich und genau das, wonach ich gesucht habe. In Kombination mit git config core.sshCommandmehreren privaten Schlüsseln ergibt sich eine vollständige nahtlose Verwaltung der Git-Identität.
25.

0

Eine Lösung besteht darin, eine Shell-Funktion manuell auszuführen, mit der meine Umgebung auf Arbeit oder Privat eingestellt wird. Ich bin mir jedoch ziemlich sicher, dass ich häufig vergessen werde, zur richtigen Identität zu wechseln, was dazu führt, dass die falsche Identität festgelegt wird.

Das war genau mein Problem. Ich habe ein Hook-Skript geschrieben, das Sie warnt, wenn Sie eine Github-Fernbedienung haben und keinen lokalen Benutzernamen definiert haben.

So richten Sie es ein:

  1. Erstellen Sie ein Verzeichnis für den globalen Hook

    mkdir -p ~/.git-templates/hooks

  2. Weisen Sie git an, alles in ~/.git-templatesIhr Projektverzeichnis zu kopieren, .gitwenn Sie git init oder clone ausführen

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

  3. Und jetzt kopiere die folgenden Zeilen in ~/.git-templates/hooks/pre-commitdie Datei und mache sie ausführbar (vergiss das nicht, sonst führt Git sie nicht aus!)

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

Wenn Sie andere Hosts für Ihre privaten Repositorys verwenden, müssen Sie diese github.comentsprechend Ihren Anforderungen ersetzen .

Jedes Mal, wenn Sie a git initoder git clonegit ausführen, wird dieses Skript in das Repository kopiert und ausgeführt, bevor ein Commit ausgeführt wird. Wenn Sie keinen lokalen Benutzernamen festgelegt haben, wird eine Warnung ausgegeben, und Sie können keine Festschreibung vornehmen.


0

Ich mag den Weg von Micah Henning in seinem Artikel sehr (siehe Einrichten von Git-Identitäten ) zu diesem Thema sehr. Die Tatsache, dass er die Identität auf jedes erstellte / geklonte Repository anwendet und erzwingt, ist ein guter Weg, um nicht zu vergessen, dies jedes Mal einzurichten.

Grundlegende Git-Konfiguration

Deaktiviert die aktuelle Benutzerkonfiguration in git:

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

Erzwingen Sie die Identitätskonfiguration für jedes neue lokale Repository:

$ git config --global user.useConfigOnly true

Erstellen Sie einen Git-Alias ​​für den identityBefehl, den wir später verwenden werden:

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

Identitätserstellung

Erstellen Sie eine Identität mit GPG (verwenden Sie gpgoder gpg2abhängig davon, was Sie auf Ihrem System haben). Wiederholen Sie die nächsten Schritte für jede Identität, die Sie verwenden möchten.

Hinweis: [keyid]Hier ist die Kennung des erstellten geheimen Schlüssels. Beispiel hier:

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]

Der 8A5C011E4CE081A5nachfolgende Teil sec rsa4096/ist die Kennung des Schlüssels.

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

Kopieren Sie den öffentlichen Schlüsselblock und fügen Sie ihn als GPG-Schlüssel zu Ihren GitHub / GitProviderOfChoice-Einstellungen hinzu.

Fügen Sie der Git-Konfiguration eine Identität hinzu. Wiederholen Sie dies auch für jede Identität, die Sie hinzufügen möchten:

Hinweis: hier verwende ich gitlabzu nennen meine Identität, sondern aus Ihrer Frage kann es etwas, ex sein: gitoliteoder github, workusw.

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

Richten Sie die Identität für ein Repository ein

Wenn einem neuen Repo keine Identität zugeordnet ist, wird beim Festschreiben ein Fehler angezeigt, der Sie daran erinnert, ihn festzulegen.

*** Please tell me who you are.

## parts of message skipped ##

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

Geben Sie die gewünschte Identität in einem neuen Repository an:

$ git identity gitlab

Sie können jetzt die Gitlab- Identität festlegen .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.