Git wypycha do zdalnego repozytorium GitHub jako niewłaściwy użytkownik

82

Mam konto służbowe GitHub i konto osobiste. Najpierw użyłem osobistego do projektów testowych, potem ruszyłem dalej i utworzyłem repozytorium na drugim koncie na tym samym komputerze.

Teraz chciałem ponownie utworzyć nowe repozytorium na swoim koncie osobistym, zmieniłem globalne i lokalne user.nameoraz utworzyłem nową parę kluczy ssh, wprowadzoną na stronie konfiguracji GitHub. Następnie założyłem katalog

git init
git remote add origin <url>
git push origin

ale to teraz mi mówi

BŁĄD: Odmowa dostępu do użytkownika personaluser / newrepo.git

Nie mam pojęcia, jak drugie konto jest połączone z tym. .git/confignie pokazuje żadnych workusernamepowiązanych rzeczy.

Jeśli używasz systemu Windows 10, nie spiesz się, aby przeczytać odpowiedź Rajana.

Raz Faz
źródło
1
W przypadku systemu Windows 10 odpowiedz poniżej. Usuń poświadczenia z menedżera poświadczeń. Zmarnowane 2 godziny czasu.
xenteros
@xenteros Proszę opublikować to jako odpowiedź. Straciłem 1h, a Ty uratowałeś mi kolejną 1h.
leksykor,

Odpowiedzi:

76

brzmi to bardzo podobnie do mojej obecnej pracy. wygląda na to, że masz już skonfigurowany oddzielny plik, ssh-keyswięc musisz również utworzyć ~/.ssh/configplik i wypełnić go informacjami podobnymi do tego:

Host work.github.com
    HostName github.com
    User WORK_GITHUB_USERNAME
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_work_rsa
    IdentitiesOnly yes

Host personal.github.com
    HostName github.com
    User PERSONAL_GITHUB_USERNAME 
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_personal_rsa
    IdentitiesOnly yes

Każda właściwość wydaje się dość oczywista, ale IdentitiesOnlyjedna. Nie będę próbował wyjaśniać, do czego to służy, ale to jest w mojej obecnej konfiguracji i działa dobrze.

Warto również zauważyć, że Host URLjest to tylko wskaźnik do przechwytywania prawidłowych ustawień użytkownika i nie ma żadnego wpływu na prawidłowe dostarczenie plików do docelowego HostNameadresu URL.

Teraz musisz tylko upewnić się, że Twój origin(lub remoteogólnie) adres URL pasuje do prawidłowego Hostadresu URL w odpowiednich repozytoriach, w zależności od nazwy użytkownika. Jeśli masz już osobiste repozytoria, możesz edytować .git/configplik tego repozytorium w swoim edytorze tekstu:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = [email protected]:PERSONAL_GITHUB_USERNAME/project.git

lub zrób to z linii poleceń:

git remote set-url origin [email protected]:PERSONAL_GITHUB_USERNAME/project.git

Podobnie jak w Twojej pracy:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = [email protected]:your_work_organization/project.git

lub znowu, z linii poleceń:

git remote set-url origin [email protected]:your_work_organization/project.git

Oczywiście zawsze możesz ustawić jeden ze swoich Hostadresów URL w swoim ~/.ssh/configpliku jako zwykły

Host github.com

Kiedyś tylko work.github.comłatwiej było widzieć relacje konfiguracyjne.

Gdy wszystkie te elementy są ustawione, powinieneś być w stanie nacisnąć każdy odpowiedni pilot.

EDYTOWAĆ

Warto zauważyć, że właśnie się przekonałem, że jeśli kiedykolwiek ustawisz globalne wartości konfiguracyjne git dla swojej user.emailwartości (i zgaduję, user.nameże wyśle ​​również inną wartość), git pokaże twoje zatwierdzenia jako ten użytkownik poczty e-mail. Aby obejść ten problem, możesz zastąpić globalne ustawienia konfiguracji git w swoim lokalnym repozytorium:

$ git config user.name "John Doe"
$ git config user.email [email protected]

Powinno to teraz wysyłać zatwierdzenia jako właściwy użytkownik dla tego repozytorium.

hellatan
źródło
3
Działa jak marzenie. Dziękuję Ci!
NorthBridge
1
Ta witryna wyjaśnia bardziej szczegółowo plik konfiguracyjny ssh dla wszystkich zainteresowanych.
Phil
3
Z pewnością najbardziej pomocna odpowiedź. Wielkie dzięki.
limp_chimp,
Znakomity! Dzięki wielkie!
Fydo
1
Klucz, którego mi brakowało, to określenie hosta ssh w pliku .git / config - wielkie dzięki!
xdotcommer
46

Wybierz kolejno Panel sterowania> Konta użytkowników> Menedżer poświadczeń> Poświadczenia ogólne

usuń poświadczenia git. Następnie uruchom git push. Spowoduje to wyświetlenie monitu o podanie danych logowania git. Wprowadź poprawne poświadczenia.

Rajan Patil
źródło
3
To rozwiązało mój problem podczas korzystania z Git Bash w systemie Windows10. Dzięki @ rajan-patil
suspicious_williams
Dla tych, którzy nie mają GUI systemu Windows w języku angielskim, możesz skontaktować się z menedżerem poświadczeń, wpisując control /name Microsoft.CredentialManagerw wierszu poleceń
bgusach
dziwne, ale działa świetnie tylko wtedy, gdy uruchamiam Git Bash (jak wspomniano powyżej), ale jeśli nadal używam tego samego terminala, zacząłem git pushz błędem - cały czas rzuca te same błędy, nawet po restarcie terminala. Ale mimo wszystko dziękuję - zaoszczędziło mi to mnóstwo czasu na koniec
Kostyantyn Didenko
To zdecydowanie najlepsza odpowiedź, z jaką się spotkałem. Reszta była zagmatwana, ale to było proste i precyzyjne.
claudekennilol
Działa to RAZ. Po ponownym dodaniu kont ten sam problem nadal występuje.
Megakoresh
38

Możesz też po prostu przełączyć się na https zamiast ssh. Jeśli używasz protokołu HTTPS, będzie to uwzględniać ustawienia .git / config. Więc w .git / config zmień:

url = [email protected]:USER/PROJECT.git

do

url = https://[email protected]/USER/PROJECT.git

(wartości te znajdują się na stronie projektu git, kliknij przyciski SSHi, HTTPaby uzyskać nowe wartości);

yuttadhammo
źródło
2
+1! To naprawdę dobre rozwiązanie do robienia jednorazowych wypychań z wypożyczonych maszyn itp., Gdzie nie chcesz instalować kluczy prywatnych itp.
lambshaanxy
1
Myślę, że jedynym problemem związanym z używaniem httpsjest to, że musisz wpisać użytkownika / przepustkę za każdym razem, gdy robisz a push, chyba że jest jakaś konfiguracja git, której nie jestem świadomy
hellatan
Wiem, że to bardzo stare, ale DZIĘKUJĘ. Mój komputer nie jest skonfigurowany do korzystania z ssh, ale nadal próbował wcisnąć na moje służbowe konto github zamiast na moje osobiste, aby jednorazowo wypchnąć. Użyłem tego w moim .git / config w katalogu mojego projektu i zadziałało niesamowicie. Yay! Głosuj za tobą.
Sady
2
pamiętaj, że git push https://username:[email protected]/user/repo.gitteż możesz to zrobić ... jeśli nie masz nic przeciwko passw swojej historii muszli
Platon
To najlepsze rozwiązanie. Dziękuję Ci!
codemicky
33

github identyfikuje cię po kluczu ssh, który widzi, a nie przez jakiekolwiek ustawienie z git.

Dlatego musisz upewnić się, że klucz ssh konta służbowego nie znajduje się w twojej bazie kluczy, gdy próbujesz push jako konto osobiste i odwrotnie. Służy ssh-add -ldo określania, które klucze znajdują się w pęku kluczy, i ssh-add -d keyfiledo usuwania klucza z pęku kluczy.

Być może będziesz musiał sprawdzić, ~/.ssh/configczy skonfigurowałeś go tak, aby prezentował określone klucze ssh na github. Wreszcie, nie wiem, jak github radzi sobie z dwoma kontami mającymi ten sam klucz publiczny ssh, więc upewnij się, że tego nie robisz.

Walter Mundt
źródło
3
Możesz także, jeśli to konieczne, użyć GIT_SSHzmiennej środowiskowej, aby powiedzieć gitowi, aby użył innego polecenia dla ssh; w szczególności możesz użyć określonego klucza. Zobacz główną stronę podręcznika git , a może to pytanie .
Cascabel,
W moim systemie (OSX 10.5) polecenie usunięcia klucza z ssh-add -d keyfile
breloka brzmiało
Dzięki @Motin, to właśnie chciałem powiedzieć. Edytowano.
Walter Mundt,
12

Ostatnio miałem ten sam problem, ponieważ utworzyłem nowe konto na Github. Wypróbowałem powyższe odpowiedzi, ale to nie pomogło. Potem zobaczyłem gdzieś post o usuwaniu github z Keychain Access (tylko jeśli używasz Maca ). Kiedy wypycham, pytam o nazwę użytkownika i hasło i zadziałało!

flipjs.io
źródło
@Carpetsmoker Wygląda na to, że OP oferuje rozwiązanie przeznaczone dla komputerów Mac.
Zev Spitz
1
Spróbuj znaleźć oryginalny post i dodaj jako link.
Zev Spitz
11

Miałem ten sam problem. Okazuje się, że miałem dwa konta na GitHubie używające tego samego klucza SSH, a GitHub domyślnie używał niewłaściwego konta, które nie miało uprawnień do repozytorium, którego szukałem. Usunąłem klucz SSH z konta, którego nie używałem, wszystkie działały zgodnie z oczekiwaniami.

Możesz sprawdzić, na którym koncie GitHub się uwierzytelnia:

ssh -T [email protected]

Dla mnie początkowo pokazywało to niewłaściwą nazwę użytkownika, ale po usunięciu zduplikowanego klucza SSH z tego konta, pokazało poprawną nazwę użytkownika, a moje pull i push do mojego repozytorium działały dobrze.

Ryan
źródło
8

Wiem, że to może być trochę za późno, ale utknąłem z tym przez jakiś czas i ostatecznie naprawiłem to w ten sposób:

przykładowy zrzut ekranu

  • Przejdź do dostępu do pęku kluczy (osX)

  • wyszukaj git (upewnij się, że wybrałeś wszystkie elementy)

  • Tutaj znajdziesz referencje winowajcy. Usuń ich.

Mam nadzieję że to pomoże!

A. Dev
źródło
To była jedyna odpowiedź, która mi pomogła!
Wilder Pereira
Ta odpowiedź pomogła mi rozwiązać problem w mac.
Javascript Hupp Technologies
6

Oto sposób na zrobienie tego: możesz użyć różnych konfiguracji ssh dla różnych kont ssh.

Zaktualizowano 22 lutego:

Sprawdź ten link: https://gist.github.com/2351996

asksw0rder
źródło
Połączone Gist i pierwszy komentarz na stronie Gist działały idealnie dla mnie. Myślę, że jest to lepsze od odpowiedzi Waltera Mundta, ponieważ możesz zostawić wiele kluczy na breloczku i wszystko „po prostu działa”.
keybits
3

Jeśli zmiana klucza SSH skojarzonego z kontem nie działa, zmień adres e-mail powiązany z kontem.

Przejdź do Github> Ustawienia konta> E-maile i sprawdź, czy adres e-mail, którego używasz do zatwierdzenia, jest zgodny z adresem e-mail na koncie.

Aby zobaczyć, jakiego adresu e-mail używasz do zatwierdzenia, uruchom następujące polecenie: git config --global user.email . Jeśli chcesz zmienić adres e-mail, którego używasz do zatwierdzenia, uruchom git config --global user.email "[email protected]".

Baub
źródło
2

Mam ten sam problem. Poniżej przedstawiam, co się dzieje w moim przypadku:

Wcześniej git nie pytał o moje dane uwierzytelniające za każdym razem, gdy rozmawiam ze zdalnym repozytorium, w ten sposób: git config --global credential.helper wincred

Rozwiązałem problem, uruchamiając to samo polecenie z „none”, zastępując „wincred” git config --global credential.helper none

Następnie ponownie zapytaj git o moją nazwę użytkownika / hasło i wszystko pójdzie dobrze

Hung Cao
źródło
1

Ja też miałem ten problem, ale żadne inne rozwiązanie nie zadziałało. Okazuje się, że do pracy stworzyliśmy .netrcplik, który zawierał wpisy do uwierzytelniania na githubie. gitKomenda zawsze używany .netrc, który miał moją starą nazwę użytkownika i hasło. Musiałem edytować wpisy w moim .netrcpliku, aby użyć nowej nazwy użytkownika i hasła.

Steven Lambert
źródło
1

Znalazłem tymczasowe rozwiązanie, w którym najpierw uruchom, killall ssh-agenta następnie dodaj klucze ssh wygenerowane dla konta, którego potrzebujeszssh-add ~/.ssh/id_4shameer

Jest to jedyny sposób, w jaki możemy pracować na wielu kontach github, gdy otrzymamy błąd typu ERROR: Permission to user/repo-git.git denied to username.

mshameer
źródło
1

Nigdy nie miałem żadnych problemów z git, dopóki w pracy nie połączyli ostatnio naszych macbooków z Active Directory i dodali kilka kont administracyjnych do mojego komputera. Jednak po tym git będzie działał dobrze, dopóki nie zablokuję ekranu i wrócę. Wtedy dostałbym niejasny błąd podobny do

No user exists for uid 1927040837
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Mam tylko jeden klucz ssh na tej konkretnej maszynie dla mojego użytkownika i używam zsh w moim okresie. Adres e-mail i nazwa użytkownika były poprawne, więc to nie był problem. Ergo, ponowne uruchamianie po każdym zablokowaniu komputera jest daremne. Rozwiązaniem dla mnie była edycja pliku.zshrc pliku i odkomentowanie wiersza eksportującego klucz ssh (czego nigdy wcześniej nie musiałem robić i używam zsh od lat).

Linia powinna wyglądać mniej więcej tak:

# ssh
export SSH_KEY_PATH="~/.ssh/<your_rsa_id>"

Gdy to zrobisz, po prostu uruchom resetterminal in i wszystko działa dobrze.

Mam nadzieję, że to pomoże komuś innemu.

Andruw Hart
źródło
0

Chciałbym dodać - Jeśli pracujesz na koncie innego użytkownika, upewnij się, że dodajesz się do obszaru współpracowników w ustawieniach repozytoriów.

Dan Kelly
źródło