Jak powiedzieć gitowi, aby używał poprawnej tożsamości (nazwy i adresu e-mail) dla danego projektu?

117

Używam osobistego laptopa zarówno do pracy, jak i do projektów osobistych i chciałbym używać służbowego adresu e-mail do wykonywania zobowiązań w pracy (gitolite) i osobistego adresu e-mail do pozostałych (github).

Czytałem o następujących rozwiązaniach, które są globalne lub tymczasowe:

Jednym z rozwiązań jest ręczne uruchomienie funkcji powłoki, która ustawia moje środowisko jako służbowe lub osobiste , ale jestem prawie pewien, że często zapominam o przełączeniu się na poprawną tożsamość, co powoduje zatwierdzenie pod niewłaściwą tożsamością.

Czy istnieje sposób powiązania określonego repozytorium, nazwy projektu itp. Z tożsamością (imię i nazwisko, e-mail)? Co robią ludzie?

Martin Jambon
źródło
1
Proszę o zaakceptowanie jednej z odpowiedzi. Mam nadzieję, że jeden z nich musiał pomóc Ci rozwiązać problem.
RBT

Odpowiedzi:

134

git config user.email "[email protected]"

Wykonanie tego wewnątrz repozytorium spowoduje ustawienie konfiguracji na TYM repozytorium, a nie globalnie.

Wygląda na to, że właśnie tego szukasz, chyba że źle cię czytam.

Dan Ray
źródło
Myślę, że to powinno wystarczyć. Spodziewam się, że będę mieć wiele lokalnych repozytoriów dla tego samego projektu, zwłaszcza w celu łatwiejszego przełączania się między oddziałami bez konieczności ponownej kompilacji wszystkiego. Może to po prostu zły nawyk svn. Dzięki.
Martin Jambon
1
@ Martin - od dawna nie używam git, ale mam wrażenie, że korzystanie z wielu lokalnych repozytoriów byłoby niezwykłym przepływem pracy dla git. Mimo to wystarczyłoby to uruchomić tylko raz na wystąpieniu repozytorium i jest ustawione na czas życia tego repozytorium, więc nie jest tak źle.
Dan Ray
@DanRay W rzeczywistości jest to typowa konfiguracja, jeśli, tak jak w przypadku Martina, lokalne repozytorium ma lokalne niezatwierdzone pliki. Przełączanie się z jednej gałęzi do drugiej nie powoduje automatycznego odbudowania plików. Jeśli celem jest uniknięcie „ponownej kompilacji wszystkiego”, użycie wielu lokalnych repozytoriów jest właściwym sposobem na zrobienie tego.
dolmen
1
git config --global user.email "[email protected]" Dodanie --global sprawi, że będzie działać we wszystkich repozytoriach. źródło: help.github.com/articles/setting-your-username-in-git
SashiOno
1
Jest to zadanie ręczne i można o nim zapomnieć. Automatyczne rozwiązania sugerują @ dragon788 i ja
naitsirch.
47

Musisz użyć lokalnego polecenia set poniżej:

zestaw lokalny

git config user.email [email protected]
git config user.name 'Mahmoud Zalt'

lokalny get

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

Lokalny plik konfiguracyjny znajduje się w katalogu projektu: .git/config.

zestaw globalny

git config --global user.email [email protected]
git config --global user.name 'Mahmoud Zalt'

globalny get

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

Globalny plik konfiguracyjny w katalogu domowym w: ~/.gitconfig.

Pamiętaj, aby cytować puste miejsca itp., Na przykład: „Imię Nazwisko”

Mahmoud Zalt
źródło
23

Edytuj plik konfiguracyjny w folderze „.git”, aby zachować inną nazwę użytkownika i adres e-mail zależny od repozytorium

  • Przejdź do swojego repozytorium
  • Pokaż ukryte pliki i przejdź do folderu „.git”
  • Znajdź plik „config”
  • Dodaj poniższe linie w EOF

[użytkownik]

imię = Bob

email = [email protected]

Poniższe polecenie pokazuje, która nazwa użytkownika i adres e-mail zostały ustawione dla tego repozytorium.

git config --get nazwa.użytkownika

git config --get user.email

Przykład: dla mnie ten plik konfiguracyjny w D: \ workspace \ eclipse \ ipchat \ .git \ config

Tutaj ipchat to nazwa mojego repozytorium

arulraj.net
źródło
16

Jeśli git config user.email "[email protected]"go użyjesz , zostanie on powiązany z bieżącym projektem, w którym jesteś.

To właśnie robię dla moich projektów. Ustawiam odpowiednią tożsamość podczas klonowania / inicjowania repozytorium. Nie jest głupi (jeśli zapomnisz i popchniesz, zanim się zorientujesz, jesteś w oponie), ale jest tak dobry, jak tylko możesz, bez możliwości powiedzeniagit config --global user.email 'ILLEGAL_VALUE'

Właściwie możesz zrobić nielegalną wartość. Ustaw swójgit config --global user.name $(perl -e 'print "x"x968;')

Następnie, jeśli zapomnisz ustawić wartości nieglobalne, otrzymasz komunikat o błędzie.

[EDYTUJ] W innym systemie musiałem zwiększyć liczbę x do 968, aby to się nie powiodło z „fatal: niemożliwie długi osobisty identyfikator”. Ta sama wersja git. Dziwne.

Seth Robertson
źródło
Brzmi jak świetna sztuczka, ale nie zadziałała. Udało się zarówno zatwierdzenie, jak i wypchnięcie do gitolite remote.
Martin Jambon
@Martin Jambon: Dziwne. Używam gita w wersji 1.7.4.5
Seth Robertson,
@Martin Jambon: Możesz także spróbować ustawić swoją globalną nazwę użytkownika / adres e-mail na „x”. Niektóre starsze wersje git odrzucały zbyt małe wartości. Zgłoś swoją wersję / system operacyjny gita, jeśli to nie działa.
Seth Robertson
@Martin Jambon: Spróbuj 968 "x" i zobacz, czy to działa lepiej.
Seth Robertson,
8

Jeśli nie użyjesz tego --globalparametru, ustawi on zmienne tylko dla bieżącego projektu.

ismail
źródło
8

Począwszy od Git 2.13 możesz użyć includeIfw swoim gitconfig pliku z inną konfiguracją w oparciu o ścieżkę do repozytorium, w którym uruchamiasz polecenia git.

Ponieważ w Ubuntu 18.04 jest dostępny wystarczająco nowy Git, używam go ~/.gitconfigcałkiem szczęśliwie.

[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

Aby korzystać z Git 2.13, musisz albo dodać PPA (Ubuntu starsze niż 18.04 / Debian) lub pobrać pliki binarne i zainstalować (Windows / inny Linux).

dragon788
źródło
Bardzo pomocny i dokładnie to, czego szukałem. W połączeniu z git config core.sshCommandwieloma kluczami prywatnymi zapewnia pełne bezproblemowe zarządzanie tożsamością git.
topr
0

Jednym z rozwiązań jest ręczne uruchomienie funkcji powłoki, która ustawia moje środowisko na służbowe lub osobiste, ale jestem prawie pewien, że często zapominam o przełączeniu się na poprawną tożsamość, co powoduje zatwierdzenie pod niewłaściwą tożsamością.

To był dokładnie mój problem. Napisałem skrypt przechwytujący, który ostrzega, jeśli masz pilota Github, a nie zdefiniowałeś lokalnej nazwy użytkownika.

Oto jak to skonfigurować:

  1. Utwórz katalog do przechowywania globalnego haka

    mkdir -p ~/.git-templates/hooks

  2. Powiedz gitowi, aby skopiował wszystko ~/.git-templatesdo .gitkatalogu na projekt po uruchomieniu git init lub clone

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

  3. A teraz skopiuj następujące wiersze do ~/.git-templates/hooks/pre-commiti uczyń plik wykonywalnym (nie zapomnij o tym, w przeciwnym razie git go nie wykona!)

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

Jeśli używasz innych hostów do swoich prywatnych repozytoriów, musisz wymienić github.comzgodnie ze swoimi potrzebami.

Teraz za każdym razem, gdy wykonasz polecenie git initlub git clonegit, skopiuje ten skrypt do repozytorium i wykona go przed wykonaniem jakiegokolwiek zatwierdzenia. Jeśli nie ustawiłeś lokalnej nazwy użytkownika, wyświetli ostrzeżenie i nie pozwoli ci zatwierdzić.

naitsirch
źródło
0

Bardzo podoba mi się sposób, w jaki Micah Henning przedstawił w jego artykule (zobacz Konfigurowanie tożsamości Git ) na ten temat. Fakt, że stosuje i wymusza tożsamość każdego utworzonego / sklonowanego repozytorium, jest dobrym sposobem, aby nie zapomnieć o ustawieniu tego za każdym razem.

Podstawowa konfiguracja gita

Usuń konfigurację bieżącego użytkownika w git:

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

Wymuś konfigurację tożsamości w każdym nowym repozytorium lokalnym:

$ git config --global user.useConfigOnly true

Utwórz alias Gita dla identitypolecenia, użyjemy później:

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

Tworzenie tożsamości

Utwórz tożsamość za pomocą GPG (użyj gpglub w gpg2zależności od tego, co masz w systemie). Powtórz kolejne kroki dla każdej tożsamości, której chcesz użyć.

Uwaga: [keyid]tutaj jest identyfikator utworzonego tajnego klucza. Przykład tutaj:

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]

8A5C011E4CE081A5Część po sec rsa4096/to identyfikator klucza.

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

Skopiuj blok kluczy publicznych i dodaj go do ustawień GitHub / GitProviderOfChoice jako klucz GPG.

Dodaj tożsamość do konfiguracji Git. Powtórz to również dla każdej tożsamości, którą chcesz dodać:

Uwaga: tutaj używam gitlababy nazwać swoją tożsamość, ale z pytaniem to może być cokolwiek, np: gitoliteczy github, workitp

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

Skonfiguruj tożsamość dla repozytorium

Jeśli nowe repozytorium nie ma przypisanej tożsamości, po zatwierdzeniu pojawi się błąd przypominający o ustawieniu.

*** Please tell me who you are.

## parts of message skipped ##

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

Określ tożsamość, którą chcesz w nowym repozytorium:

$ git identity gitlab

Jesteś teraz gotowy, aby zaangażować się w tożsamość gitlab .

elbaid
źródło