Jak uniknąć podania nazwy użytkownika i hasła przy każdym wypychaniu git?

317

Pracuję git pushw zdalnym repozytorium Git.

Każdy pushpoprosi mnie o wpisanie usernamei password. Chciałbym tego uniknąć przy każdym wypychaniu, ale jak skonfigurować, aby tego uniknąć?

Leem.fin
źródło
6
Odpowiedź jest dostępna tutaj: stackoverflow.com/questions/6565357/…
kbdjockey
3
Krótko mówiąc: Dla github, wykonaj następujące dwa linki help.github.com/articles/generating-ssh-keys help.github.com/articles/changing-a-remote-s-url
JRun
w przypadku bitbucket skorzystaj z tego linku
JDP

Odpowiedzi:

346

1. Wygeneruj klucz SSH

Linux / Mac

Otwórz terminal, aby utworzyć klucze ssh:

cd ~                 #Your home directory
ssh-keygen -t rsa    #Press enter for all values

Dla Windowsa

(Działa tylko, jeśli program zatwierdzania jest w stanie używać certyfikatów / prywatnych i publicznych kluczy ssh)

  1. Użyj Putty Gen, aby wygenerować klucz
  2. Wyeksportuj klucz jako otwarty klucz SSH

Oto przewodnik na temat putty gen dla powyższych kroków

2. Powiąż klucz SSH ze zdalnym repozytorium

Ten krok różni się w zależności od konfiguracji pilota.

  • Jeśli jest to repozytorium GitHub i masz uprawnienia administracyjne, przejdź do ustawień i kliknij „dodaj klucz SSH”. Skopiuj zawartość ~/.ssh/id_rsa.pubdo pola oznaczonego „Klucz”.

  • Jeśli Twoje repozytorium jest administrowane przez kogoś innego, daj administratorowi swój id_rsa.pub.

  • Jeśli twoje zdalne repozytorium jest zarządzane przez twoje, możesz użyć tego polecenia na przykład:

    scp ~/.ssh/id_rsa.pub YOUR_USER@YOUR_IP:~/.ssh/authorized_keys/id_rsa.pub

3. Ustaw zdalny adres URL na formularz, który obsługuje SSH 1

Jeśli wykonałeś powyższe kroki i nadal pojawia się monit o hasło, upewnij się, że adres URL repozytorium jest w formie

git+ssh://[email protected]/username/reponame.git

w przeciwieństwie do

https://github.com/username/reponame.git

Aby zobaczyć adres URL repozytorium, uruchom:

git remote show origin

Możesz zmienić adres URL za pomocą:

git remote set-url origin git+ssh://[email protected]/username/reponame.git

[1] Ta sekcja zawiera odpowiedź Erica P.

First Zero
źródło
3
Uruchomiłem krok 1 i krok 2 na Ubuntu, ale wciąż pyta mnie o U_ID passwd. Uruchomiłem także: ssh -T [email protected]. Wciąż ten sam. Co robić?
Radhika
4
@Rads Czy próbowałeś / -aś innej odpowiedzi, autorstwa Erica P ?
yo „
2
@dialex Miał na myśli osobę, która zarządza zdalnym repozytorium git.
selalerer
5
git zdalny set-url origin git + ssh: //[email protected]/username/reponame.git to polecenie jest dla mnie pomocne.
Sztuczna
2
To zadziałało dla mniegit remote set-url origin [email protected]:/username/projectname.git
Kurt
181

Trwałe uwierzytelnianie za pomocą repozytoriów Git,

Uruchom następujące polecenie, aby włączyć buforowanie referencji.

$ git config credential.helper store
$ git push https://github.com/repo.git

Username for 'https://github.com': <USERNAME>
Password for 'https://[email protected]': <PASSWORD>

Opcja powinna również określać wygasanie buforowania ,

git config --global credential.helper 'cache --timeout 7200'

Po włączeniu buforowania poświadczeń będzie ono buforowane przez 7200 sekund (2 godziny) .

Uwaga: Pomocnik poświadczeń przechowujący niezaszyfrowane hasło na dysku lokalnym.

Jay Patel
źródło
4
Dzięki. Czy możesz wyjaśnić, co robi polecenie config? Zastanawiam się, dlaczego nawet nie pyta mnie o hasło przy pierwszym uruchomieniu repo.
HelloWorldNoMore
1
@vivoconunxino Prawdopodobnie dlatego, że jest z natury niebezpieczny. Z strony gitpodręcznika: „Korzystanie z tego pomocnika spowoduje przechowywanie haseł w postaci niezaszyfrowanej na dysku, chronionej tylko uprawnieniami systemu plików”.
cmaster
15
W tej odpowiedzi brakuje ostrzeżenia o storepomocniku poświadczającym przechowującym hasło na dysku w postaci niezaszyfrowanej.
cmaster
1
@DavidRTribble: ustawić pamięć podręczną? Lub usuń odpowiedni plik, zobacz git-scm.com/docs/git-credential-store
serv-inc
1
@DavidRTribble: lepiej:git config --unset credential.helper
serv-inc
116

Jeśli masz już skonfigurowane klucze SSH i nadal pojawia się monit o hasło, upewnij się, że adres URL repozytorium jest w formie

git+ssh://[email protected]/username/reponame.git

w przeciwieństwie do

https://github.com/username/reponame.git

Aby zobaczyć adres URL repozytorium, uruchom:

git remote show origin

Możesz zmienić adres URL za pomocą git remote set-url:

git remote set-url origin git+ssh://[email protected]/username/reponame.git
Eric P.
źródło
Właśnie to rozwiązało mój problem po git initlokalnym użyciu, a następnie próbie wypchnięcia po dodaniu pilota z nowego repozytorium na stronie GitHub.
sheldonkreger
1
Nie jestem pewien, dlaczego nie jest to część przyjętej odpowiedzi. Dzięki!
spacer
1
Akceptowana odpowiedź powinna składać się z faktycznie zaakceptowanej odpowiedzi PLUS tej.
Puce
3
Możesz pominąć „git + ssh: //” i po prostu użyj[email protected]/username/reponame.git
Ivan Shulev
1
@IvanShulev Próbowałem początkowo bez git + ssh i nie zadziałało
Antonello,
40

Wystarczy użyć --repoopcji polecenia git push. Lubię to:

$ git push --repo https://name:[email protected]/name/repo.git
Pavel
źródło
37
Możesz też ustawić to domyślnie za pomocą opcjigit remote set-url origin https://name:[email protected]/repo.git
ACyclic
Zwracam uwagę, że ustawienie adresu URL na tylko [email protected]/....gitdziała, jeśli nie przeszkadza ci hasło za każdym razem.
dzisiaj
Dla użytkowników github git push --repo https://github.com/Username/repo Działa bez .git rozszerzenia
Pe Dro
24

Oszczędzanie na czas nieokreślony

Możesz użyć sklepu git-credential-store przez

git config credential.helper store

który przechowuje twoje hasło niezaszyfrowane w systemie plików :

Korzystanie z tego pomocnika będzie przechowywać hasła niezaszyfrowane na dysku, chronione tylko przez uprawnienia systemu plików. Jeśli nie jest to akceptowalny kompromis w zakresie bezpieczeństwa, spróbuj git-credential-cache lub znajdź pomocnika, który integruje się z bezpieczną pamięcią zapewnianą przez twój system operacyjny.

Z limitem czasu

Użyj pamięci podręcznej git-credential-cache, która domyślnie przechowuje hasło przez 15 minut.

git config credential.helper cache

aby ustawić inny limit czasu, użyj --timeout(tutaj 5 minut)

git config credential.helper 'cache --timeout=300'

Bezpieczne zapisywanie w nieskończoność (OS X i Windows)

  • Jeśli używasz komputera Mac, Git ma tryb „osxkeychain” , który buforuje poświadczenia w bezpiecznym pęku kluczy dołączonym do konta systemowego. Ta metoda przechowuje poświadczenia na dysku i nigdy nie wygasają, ale są one szyfrowane za pomocą tego samego systemu, który przechowuje certyfikaty HTTPS i autouzupełnianie Safari. Uruchomienie następuje w wierszu poleceń będzie włączyć tę funkcję: git config --global credential.helper osxkeychain. Musisz również przechowywać dane uwierzytelniające w pęku kluczy przy użyciu aplikacji pęku kluczy.
  • Jeśli używasz systemu Windows, możesz zainstalować pomocnika o nazwie „Git Credential Manager dla systemu Windows”. Jest to podobne do opisanego powyżej pomocnika „osxkeychain”, ale używa Windows Credential Store do kontrolowania poufnych informacji. Można go znaleźć pod adresem https://github.com/Microsoft/Git-Credential-Manager-for-Windows . [podkreśla moje]
serv-inc
źródło
W systemie Windows credential.helper cacheNIE działa. Powinno być git config --global credential.helper wincred.
Paulo Merson
1
Jest to pomocne, gdy musisz korzystać z protokołu https. Mój git na serwerze zawiesza się, jeśli używam ssh, więc nie mam opcji kluczy SSH.
Sridhar Sarnobat
8

Korzystałem z linku https ( https://github.com/org/repo.git) zamiast linku ssh;

[email protected]:org/repo.git  

Przełączanie rozwiązało problem dla mnie!

ishan
źródło
6

Krok 1 -

Utwórz klucze SSH w systemie Linux za pomocą poniższego polecenia

ssh-keygen -t rsa -b 4096 -C "your_email"

Poprosi o podanie hasła i nazwy pliku (domyślnie będzie to ~ / .ssh / id_rsa, ~ / .ssh / id_rsa.pub)

Krok 2 -

Po utworzeniu plików dodaj klucz publiczny id_rsa.pub do sekcji ssh konta github.

Krok 3 -

Na swoim komputerze dodaj klucz prywatny id_rsa do ssh-agent za pomocą poniższej komendy

ssh-add ~/.ssh/id_rsa 

Krok 4 -

Teraz dodaj zdalny adres URL [email protected]: nazwa_użytkownika / nazwa_profilu.git do lokalnego repozytorium git przy użyciu poniższej komendy.

git remote remove origin
git remote add origin [email protected]:user_name/repo_name.git

Otóż ​​to.

Anil Agrawal
źródło
5

W systemie operacyjnym Windows użyj tego zamiast tego, to działa dla mnie:

https://{Username}:{Password}@github.com/{Username}/{repo}.git

na przykład

git clone https://{Username}:{Password}@github.com/{Username}/{repo}.git

git pull https://{Username}:{Password}@github.com/{Username}/{repo}.git

git remote add origin https://{Username}:{Password}@github.com/{Username}/{repo}.git

git push origin master
Ayejuni Ilemobayo Kings
źródło
5

Chciałem tylko kilka razy wspomnieć o wyżej wspomnianym rozwiązaniu:

git config credential.helper store

Po tym można użyć dowolnego polecenia wymagającego hasła. Nie musisz naciskać. (możesz też na przykład wyciągnąć). Następnie nie będziesz musiał ponownie wpisywać nazwy użytkownika / hasła.

TrollAxeThrower
źródło
3

Użyłem odpowiedzi, którą zasugerował Pavel i zadziałała dla mnie. Moją różnicą było to zrobić, gdy dodawałem pilota tak:git remote add (alias) https://(name:password)@github.com/(the remote address).git

dsmryder
źródło
3

Uruchomienie poniższego polecenia rozwiązało problem.

git config --global credential.helper wincred

Zapoznaj się z poniższą dokumentacją github:

https://help.github.com/articles/caching-your-github-password-in-git/
Kryszna
źródło
3

O ile mi wiadomo, istnieją po prostu dwa bezpieczne sposoby: szyfrowanie ssh lub passwd przy użyciu magazynu kluczy .

SSH

  1. Zaloguj się do swojego github;
  2. Odwiedź: https://github.com/settings/keys ;
  3. Nowy klucz SSH;
  4. cat ~/.ssh/id_rsa.pub, wklej go tam, nazwij i zapisz (jeśli nie masz takiego pliku, wygeneruj go dla siebie ssh-keygen -t rsa- wystarczy wpisać Enter dla wszystkich monitów);
  5. Przejdź do lokalnego repozytorium i zaktualizuj pilota przez git remote set-url origin git+ssh://[email protected]/username/reponame.git- możesz to najpierw sprawdzić git remote -v);
  6. Proszę, touch t; git add t; git commit -m "test"; git pushpotwierdź, aby cieszyć się światem bez hasła .

passwd SZYFROWANE za pomocą magazynu kluczy

Jeśli użyjesz tak, git config --global credential.helper storejak wspomniano wcześniej, Twoje niezaszyfrowane hasła będą przechowywane w postaci zwykłego tekstu, pod ~/.git-credentialsktórym nie jest to bezpieczne, jak się wydaje.

Spróbuj zaszyfrować jako

sudo apt-get install libgnome-keyring-dev
sudo make --directory=/usr/share/doc/git/contrib/credential/gnome-keyring
git config --global credential.helper /usr/share/doc/git/contrib/credential/gnome-keyring/git-credential-gnome-keyring

git config --global credential.helper store

W takim przypadku używasz https://[email protected]/username/reponame.git.

Hearen
źródło
2

Moje rozwiązanie w systemie Windows:

  1. Kliknij katalog prawym przyciskiem myszy i wybierz „Git Bash Here”.
  2. ssh-keygen -t rsa (Naciśnij Enter, aby wyświetlić wszystkie wartości)
  3. Sprawdź terminal pod kątem: Your public key has been saved in /c/Users/<your_user_name_here>/.ssh/id_rsa.pub
  4. Skopiuj klucz publiczny z określonego pliku.
  5. Przejdź do swojego profilu GitHub => Ustawienia => Klucze SSH i GPG => Nowy klucz SSH => Wklej tam klucz SSH => Zapisz
Мони Мон
źródło
2

Jeśli Twój komputer jest bezpieczny lub nie obchodzi Cię bezpieczeństwo hasła, możesz to osiągnąć w bardzo prosty sposób. Zakładając, że zdalne repozytorium znajduje się na GitHub i originjest Twoją lokalną nazwą dla zdalnego repozytorium, użyj tego polecenia

git remote set-url --push origin https://<username>:<password>@github.com/<repo>

--pushFlag Gwarantuje to zmienia adres URL repozytorium dla git pushtylko polecenia. (Pytanie zadane w pierwotnym poście dotyczy git pushtylko polecenia. Wymaganie nazwy użytkownika + hasła tylko do operacji wypychania to normalna konfiguracja publicznych repozytoriów w GitHub. Pamiętaj, że prywatne repozytoria w GitHub również wymagałyby nazwy użytkownika + hasła do operacji ściągania i pobierania , więc w przypadku prywatnego repozytorium nie chcesz używać --push flag...)

OSTRZEŻENIE: Jest to z natury niebezpieczne, ponieważ:

  1. Twój dostawca usług internetowych lub ktokolwiek logujący się do Twojej sieci uzyskuje dostęp, może łatwo zobaczyć hasło w postaci zwykłego tekstu w adresie URL;

  2. każdy, kto uzyska dostęp do komputera, może wyświetlić Twoje hasło za pomocą git remote show origin.

Dlatego użycie klucza SSH jest akceptowaną odpowiedzią.

Nawet klucz SSH nie jest całkowicie bezpieczny . Każdy, kto uzyska dostęp do twojego komputera, może na przykład wykonywać wypychania, które niszczą twoje repozytorium lub, co gorsza, zatwierdza wypychanie, dokonując subtelnych zmian w kodzie. (Wszystkie wypychane zatwierdzenia są oczywiście bardzo widoczne na GitHub. Ale jeśli ktoś chciałby ukradkiem zmienić kod, mógł --amendwcześniej zatwierdzić bez zmiany komunikatu zatwierdzenia, a następnie wymusić jego wypchnięcie. Byłoby to podstępne i dość trudne do zauważenia w praktyce. )

Ale ujawnienie hasła jest gorsze . Jeśli atakujący pozna twoją nazwę użytkownika i hasło, może zrobić takie rzeczy, jak zablokowanie cię z własnego konta, usunięcie konta, trwałe usunięcie repozytorium itp.


Alternatywnie - dla uproszczenia i bezpieczeństwa - możesz podać tylko swoją nazwę użytkownika w adresie URL, dzięki czemu będziesz musiał wpisać hasło za każdym razem, git pushale nie będziesz musiał podawać swojej nazwy za każdym razem. (Bardzo podoba mi się to podejście, konieczność wpisania hasła daje mi przerwę na myślenie za każdym razem git push, więc nie mogę git pushprzez przypadek.)

git remote set-url --push origin https://<username>@github.com/<repo>
radfast
źródło
co jeśli hasło ma @, to łamie polecenie myśląc hasło po @ jako część serwera git?
Pranav Singh,
Jeśli twoje hasło zawiera „@”, jesteś tutaj sam, przepraszam. Możesz zmienić hasło?
radfast
Potrzebuję zgłosić prośbę o zmianę hasła, ponieważ przeprowadzałem automatyzację ciągłej integracji z kontem serwisowym (nie osobistym). W tej chwili używane klucze SSH do bezpiecznego logowania
Pranav Singh
1

Wszystko to powstaje, ponieważ git nie udostępnia opcji w komendach klonowania / ciągnięcia / wypychania / pobierania, aby wysłać poświadczenia przez potok. Chociaż daje credential.helper, przechowuje w systemie plików lub tworzy demona itp. Często poświadczenia GIT są na poziomie systemu, a obowiązkiem zapewnienia ich bezpieczeństwa jest aplikacja wywołująca polecenia git. Rzeczywiście bardzo niebezpieczne.

Oto, co musiałem obejść. 1. Wersja Git (git --version) powinna być większa lub równa 1.8.3.

KLON GIT

Do klonowania użyj „git clone URL” po zmianie adresu URL z formatu http: // {myuser} @ {my_repo_ip_address} / {myrepo_name.git} na http: // {myuser}: {mypwd} @ {my_repo_ip_address} /{myrepo_name.git}

Następnie wyczyść repozytorium hasła, jak w następnej sekcji.

BIEGUNKA

Teraz by to poszło i

  1. napisał hasło w git zdalne pochodzenie. Wpisz „git remote -v”, aby zobaczyć uszkodzenia. Popraw to, ustawiając adres URL zdalnego źródła bez hasła. „git remote set_url origin http: // {myuser} @ {my_repo_ip_address} / {myrepo_name.git}”
  2. zapisał hasło w .git / logs w repozytorium. Zamień wszystkie instancje pwd za pomocą komendy unix, np. Find .git / logs -exec sed -i 's / {my_url_with_pwd} // g' {} \; Tutaj {my_url_with_pwd} to adres URL z hasłem. Ponieważ adres URL zawiera ukośniki, musi być poprzedzony dwoma ukośnikami. Na przykład dla adresu URL http: // kris: [email protected]/proj.git -> http: \\ / \\ / kris: [email protected] \\ / proj.git

Jeśli aplikacja używa Java do wydawania tych poleceń, użyj ProcessBuilder zamiast Runtime. Jeśli musisz użyć Runtime, użyj getRunTime (). Exec, który przyjmuje tablicę String jako argumenty z / bin / bash i -c jako argumenty, a nie argument, który przyjmuje pojedynczy String jako argument.

GIT FETCH / PULL / PUSH

  1. ustaw hasło w zdalnym adresie URL git jako: "git remote set_url origin http: // {myuser}: {mypwd} @ {my_repo_ip_address} / {myrepo_name.git}"
  2. Wydaj polecenie git fetch / push / pull. Nie pojawi się monit o podanie hasła.
  3. Wykonaj oczyszczanie jak w poprzednim rozdziale. Nie przegap tego.
Kryszna
źródło
0

Musisz skonfigurować klucz prywatny SSH, możesz przejrzeć tę stronę , jak przeprowadzić konfigurację na Macu, jeśli jesteś na Linuksie przewodnik powinien być prawie taki sam, w systemie Windows potrzebujesz narzędzia takiego jak MSYS .

RageZ
źródło
0

Wydaje się, że przynajmniej podczas korzystania z TortoiseGIT w systemie Windows możliwe jest utworzenie kluczy SSH i przesłanie ich na serwer GIT przy użyciu:

> ssh-keygen.exe
> ssh-copy-id [username]@[GIT_server]
EquipDev
źródło