Как указать имя пользователя и пароль при запуске «git clone git@remote.git»?

847

Я знаю, как предоставить имя пользователя и пароль для запроса HTTPS, например:

git clone https://username:password@remote

Но я хотел бы знать, как предоставить имя пользователя и пароль для пульта, например:

git clone git@remote.git

Я пытался так:

git clone username:password@git@remote.git
git clone git@username:password@remote.git
git clone git@remote.git@username:password

Но они не сработали.

координировать
источник
4
Ты не можешь «Git» перед «@» уже является именем пользователя. Откуда вы взяли URL хранилища (git@remote.get)? Откуда вы взяли, что вам нужно указать другое имя пользователя и пароль?
Кен Томасес
3
URL моего репозитория взят из heroku "git@heroku.com: zxy-helloworld.git". И я использую оболочку emacs для клонирования и отправки. Если оболочка запрашивает пароль, emacs зависнет. Это известная проблема с emacs в Windows: gnu.org/software/emacs/windows/…
координата
Что если имя пользователя - это электронная почта? как вы это печатаете? myemail @ gmail.com @ example.com ?
Кён Перес

Ответы:

1319

Основываясь на комментарии Майкла Шарфа:

Вы можете пропустить пароль, чтобы он не был зарегистрирован в вашем файле истории Bash:

git clone https://username@github.com/username/repository.git

Он попросит вас ввести пароль.

В качестве альтернативы вы можете использовать:

git clone https://username:password@github.com/username/repository.git

Этот способ работал для меня из репозитория GitHub.

Bassetassen
источник
5
это не должно быть таким же, кстати. Если ваш коллега создал репозиторий git и вы входите в систему под другой учетной записью, они не будут такими же.
Holgac
49
Не рекомендуется помещать пароль в URL, поскольку этот файл сохраняется в .git / config. Не безопасно, лучше использовать ключ ssh
zetanova
55
@MrDuk нет проблем, избегай его (как% 40 iirc).
Бенджамин Грюнбаум
57
Вы можете оставить пароль: git clone https://username@github.com/username/repository.git. git спросит вас, и он не будет сохранен ни в .git / config, ни в вашей истории bash
Michael_Scharf
37
Вы также можете ввести «пробел» в начале строки, чтобы linux не
сохранял
213

user@host:path/to/repoФормат говорит Git для использования SSH , чтобы войти в систему hostс именем пользователя user. От git help clone:

Альтернативный scp-подобный синтаксис также может использоваться с протоколом ssh:

[user@]host.xz:path/to/repo.git/

Часть перед @именем пользователя, а метод аутентификации (пароль, открытый ключ и т. Д.) Определяется с помощью ssh, а не Git. Git не может передать пароль в ssh, потому что ssh может даже не использовать пароль в зависимости от конфигурации удаленного сервера.

Используйте, ssh-agentчтобы не вводить пароли постоянно

Если вы не хотите вводить свой пароль ssh все время, типичное решение состоит в том, чтобы сгенерировать пару открытого и закрытого ключей , поместить открытый ключ в ~/.ssh/authorized_keysфайл на удаленном сервере и загрузить свой закрытый ключ ssh-agent. Также смотрите Настройку Git через SSH для входа раз , страница помощи GitHub по ключевым SSH фраз , SSH документации gitolite в и документации ключей SSH Heroku в .

Выбор между несколькими учетными записями на GitHub (или Heroku или ...)

Если у вас есть несколько учетных записей в таких местах, как GitHub или Heroku, у вас будет несколько ключей ssh ​​(как минимум по одной на учетную запись). Чтобы выбрать учетную запись, под которой вы хотите войти, вы должны указать ssh, какой закрытый ключ использовать .

Например, предположим, у вас было две учетные записи GitHub: fooи bar. Ваш ключ ssh для foois ~/.ssh/foo_github_idи ваш ключ ssh для baris ~/.ssh/bar_github_id. Вы хотите получить доступ git@github.com:foo/foo.gitс вашей fooучетной записью и git@github.com:bar/bar.gitс вашей barучетной записью. Вы бы добавили следующее к вашему ~/.ssh/config:

Host gh-foo
    Hostname github.com
    User git
    IdentityFile ~/.ssh/foo_github_id
Host gh-bar
    Hostname github.com
    User git
    IdentityFile ~/.ssh/bar_github_id

Затем вы бы клонировали два репозитория следующим образом:

git clone gh-foo:foo/foo.git  # logs in with account foo
git clone gh-bar:bar/bar.git  # logs in with account bar

Избегать SSH в целом

Некоторые сервисы предоставляют доступ HTTP как альтернативу ssh:

  • GitHub:

    https://username:password@github.com/username/repository.git
    
  • Gitorious:

    https://username:password@gitorious.org/project/repository.git
    
  • Heroku: см. Эту статью поддержки .

ВНИМАНИЕ : Добавление вашего пароля к URL-адресу клона приведет к тому, что Git сохранит ваш пароль в виде открытого текста .git/config. Чтобы надежно сохранить свой пароль при использовании HTTP, используйте помощник по учетным данным. Например:

git config --global credential.helper cache
git config --global credential.https://github.com.username foo
git clone https://github.com/foo/repository.git

Вышеуказанное заставит Git запрашивать ваш пароль каждые 15 минут (по умолчанию). Смотрите git help credentialsподробности.

Ричард Хансен
источник
Это лучшее объяснение того, как git работает с SSH. Насколько я понимаю, когда вы указываете git@githost.com: path / to / repo.git, он фактически говорит git, что пользователь сам является git и что он должен получить ваши учетные данные (открытый ключ) из ssh-agent для Хост "githost.com".
Анаэль
39

В комментариях @ Bassetassen в ответ , @plosco отметил , что вы можете использовать , git clone https://<token>@github.com/username/repository.gitчтобы клонировать из GitHub , по крайней мере. Я подумал, что я буду расширять, как это сделать, на случай, если кто-нибудь встретит этот ответ, как я, пытаясь автоматизировать клонирование.

GitHub имеет очень удобное руководство о том, как это сделать, но оно не охватывает, что делать, если вы хотите включить все это в одну строку для целей автоматизации. Он предупреждает, что добавление токена к URL-адресу клона сохранит его в виде открытого текста в .git/config . Очевидно, что это риск для безопасности почти в каждом случае использования, но, поскольку я планирую удалить репозиторий и отозвать токен, когда я закончу, мне все равно.

1. Создайте токен

У GitHub есть целое руководство о том, как получить токен, но вот TL; DR.

  1. Перейдите в « Настройки»> «Настройки разработчика»> «Жетоны личного доступа» ( вот прямая ссылка )
  2. Нажмите «Создать новый токен» и введите свой пароль еще раз. ( Вот еще одна прямая ссылка )
  3. Задайте для него описание / имя, проверьте разрешение «РЕПО» и нажмите кнопку «Создать токен» в нижней части страницы.
  4. Скопируйте новый токен, прежде чем покинуть страницу

2. Клонировать репо

То же, что команда @plosco дал, git clone https://<token>@github.com/<username>/<repository>.gitпросто заменить <token>, <username>и <repository>с тем, что ваша информация находится.

Если вы хотите клонировать его в определенную папку, просто вставьте в конец адрес папки следующим образом: git clone https://<token>@github.com/<username>/<repository.git> <folder>где <folder>, как вы уже догадались, папка для клонирования! Вы , конечно , можете использовать ., .., ~и т.д. здесь , как вы можете в другом месте.

3. Не оставляйте следов

Не все это может быть необходимо, в зависимости от того, насколько чувствительным является то, что вы делаете.

  • Вы, вероятно, не хотите оставлять этот токен без присмотра, если у вас нет намерения использовать его в течение некоторого времени, поэтому вернитесь на страницу токенов и нажмите кнопку удаления рядом с ним.
  • Если вам больше не нужен репо, удалите его rm -rf <folder>.
  • Если вам снова потребуется репозиторий, но вам не нужно его снова автоматизировать, вы можете удалить пульт, выполнив git remote remove originили просто удалив токен, запустив git remote set-url origin https://github.com/<username>/<repository.git>.
  • Очистите историю bash, чтобы токен не оставался там зарегистрированным. Есть много способов сделать это, посмотрите этот вопрос и этот вопрос . Однако может быть проще просто добавить все вышеперечисленные команды с пробелом, чтобы предотвратить их сохранение с самого начала.

Обратите внимание, что я не профессионал, поэтому вышеизложенное может быть небезопасным в том смысле, что не останется никаких следов для какой-либо криминалистической работы.

Роб Роуз
источник
1
https://<token>@github.comне был принят с моим порталом, я должен был использоватьhttps://oauth2:<token>@github.com
MushyPeas
25

Хотя есть много ответов, я сталкиваюсь с повторяющейся проблемой, когда имя пользователя или пароль содержат специальные символы.

URL кодирует ваше имя пользователя и пароль для git, а затем использует его как часть самого URL (когда нет проблем с безопасностью).

Скажем, в URL закодировано значение имени пользователя

'user + 1' - это пользователь% 2B1

и URL закодировано значение пароля

«Добро пожаловать @ 1234» Добро пожаловать% 401234

Тогда ваш GIT Clone URL будет выглядеть так:

git clone https://user%2B1:Welcome%401234@actual-git-url-for-the-repo работает отлично, тогда как,

git clone https: // user + 1: Welcome @ 1234 @ actual-git-url-for-the-repo выдает 403 ошибки

Надеюсь это поможет.

На всякий случай, хотите, чтобы URL кодировал онлайн: https://www.urlencoder.org/

Сантош Кумар Арджунан
источник
13

Я решил эту проблему следующим образом:

введите описание изображения здесь

BehrouzMoslem
источник
11
Никогда не рекомендуется вводить пароль в командной строке. Знаете ли вы, что ваша система может хранить историю командной строки в файле? (Пример: в Linux есть скрытый файл с именем .bash_history)
август
Правильный. Всякий раз, когда я делаю это или что-то подобное, что иногда может быть очень удобно, я всегда удаляю команду, которую я использовал, из истории (history -d).
Франческо Маркетти-Штази
4
@ FrancescoMarchetti-Stasi вам не нужно удалять команду, просто используйте пробел в начале команды, и она никогда не будет сохранена в истории.
Иштияк Хусейн
Да, я узнал об этом только пару месяцев назад, после почти 30 лет работы в системах Unix ... позор мне :)
Франческо Маркетти-Штази
9

В Windows следующие шаги должны повторно вызвать окно входа в GitHub при git cloneзагрузке:

  • Начальное меню поиска для «Диспетчера учетных данных»
  • Выберите «Учетные данные Windows»
  • Удалите все учетные данные, связанные с Git или GitHub

результат

Ore4444
источник
8

Следуйте этим аргументам, чтобы заменить ваши особые случаи, если они создают проблему:

! # $ & '() * +, /:; знак равно @ []

% 21% 23% 24% 26% 27% 28% 29% 2A% 2B% 2C% 2F% 3A% 3B% 3D% 3F% 40% 5B% 5D

Так, например,

фактический URL: https: // usern @ me: p @ ssword @ git / reponame.git

URL решения для использования: https: // usern% 40me: p%40ssword@git/reponame.git

Аншуман Бардхан
источник
Это была именно та проблема, которую я искал, и ответ работал отлично. Большое спасибо.
invinciblemuffi
5
git config --global core.askpass

Запустите это, прежде чем клонировать таким же образом, должно быть исправлено!

Рохан
источник
3
Пробовал тот, все еще не просит это.
Мартен Кифт
Настройка глобальной конфигурации никогда не является хорошей идеей, поскольку она может испортить другие клоны.
Мартин
1

Это отличный вопрос о переполнении стека, и ответы были очень поучительными, так что я смог решить досадную проблему, с которой столкнулся недавно.

Организация, в которой я работаю, использует Atlassian's BitBucketпродукт (не Github), в основном свою версию GitHub, так что хранилища могут быть полностью защищены на месте. Я столкнулся с проблемой, подобной @coordinate, в которой мой пароль был необходим для нового репозитория, который я извлек. Мои учетные данные были сохранены в глобальном масштабе для всех BitBucketпроектов, поэтому я не уверен, что привело к потере учетных данных.

Короче говоря, я смог ввести следующую команду GIT (предоставив только мое имя пользователя), которая затем предложила Git's Credential Manager запросить у меня пароль, который я затем смог сохранить.

git clone https://user@code.domain.org/git/[organization]/[team]/[repository.git]

ПРИМЕЧАНИЕ: вложенные пути в квадратных скобках просто ссылаются на внутренние ссылки и будут отличаться для вас!

Майкл М
источник
0

Если вы используете http/httpsи хотите ПОЛНОСТЬЮ АВТОМАТИЗИРОВАТЬ процесс, не требуя ввода данных пользователем или каких-либо пользовательских запросов вообще (например: внутри конвейера CI / CD), вы можете использовать следующий подход, используяgit credential.helper

GIT_CREDS_PATH="/my/random/path/to/a/git/creds/file"
# Or you may choose to not specify GIT_CREDS_PATH at all.
# See https://git-scm.com/docs/git-credential-store#FILES for the defaults used

git config --global credential.helper "store --file ${GIT_CREDS_PATH}"
echo "https://alice:${ALICE_GITHUB_PASSWORD}@github.com" > ${GIT_CREDS_PATH}

где вы можете установить ALICE_GITHUB_PASSWORDпеременную окружения из предыдущей команды оболочки или из вашей конфигурации конвейера и т. д.

Помните, что git-credential-helper на основе store хранит пароли и значения в виде простого текста. Поэтому убедитесь, что ваш токен / пароль имеет очень ограниченные разрешения.


Теперь просто использовать https: //alice@github.com/my_repo.git везде , где нужна ваша автоматизированная система для извлечения репо - он будет использовать учетные данные для aliceв github.comкачестве магазина по мерзавца-учетных-хелперов.

Ракиб
источник