Как мне настроить git на автоматическую отправку в удаленное репо (включая автоматическое предоставление моей парольной фразы) после каждой фиксации в локальном репо?
Как мне настроить git на автоматическую отправку в удаленное репо (включая автоматическое предоставление моей парольной фразы) после каждой фиксации в локальном репо?
Ответы:
Во-первых, убедитесь, что вы можете нажать вручную, не вводя пароль. Если вы используете HTTP или HTTPS, это будет случай либо создания .netrcфайла с данными для входа в систему, либо добавления вашего имени пользователя и пароля в URL-адрес для удаленного . Если вы используете SSH, вы можете создать пару ключей, в которой закрытый ключ не имеет пароля, или использовать ssh-agentдля кеширования своего закрытого ключа .
Затем вы должны создать исполняемый ( chmod +x) файл .git/hooks/post-commit, содержащий следующее:
#!/bin/sh
git push origin master
... настраивая эту строку, если вы хотите отправить на удаленный компьютер, отличный от origin, или отправить ветку, отличную от master. Убедитесь, что вы сделали этот файл исполняемым.
.git/configпрефиксом feature/xy/.
Если вы начнете использовать больше, чем основную ветку, вы можете автоматически нажать текущую ветвь. Мой hook ( .git/hooks/post-commit) выглядит так:
#!/usr/bin/env bash
branch_name=$(git symbolic-ref --short HEAD)
retcode=$?
non_push_suffix="_local"
# Only push if branch_name was found (my be empty if in detached head state)
if [ $retcode -eq 0 ] ; then
#Only push if branch_name does not end with the non-push suffix
if [[ $branch_name != *$non_push_suffix ]] ; then
echo
echo "**** Pushing current branch $branch_name to origin [i4h post-commit hook]"
echo
git push origin $branch_name;
fi
fi
Он подталкивает текущую ветку, если он может определить имя ветки с помощью git symbolic-ref.
" Как получить текущее название ветки в Git? » Касается этого и других способов получения текущего имени ветки.
Автоматический толчок для каждой ветки может мешать при работе в ветвях задач, где вы ожидаете, что произойдет некоторая колбаса (вы не сможете легко переустановить после нажатия). Таким образом, ловушка не будет подталкивать ветки, заканчивающиеся определенным суффиксом (в примере "_local").
#!/bin/shчтобы она работала. В противном случае он твердил: error: cannot run .git/hooks/post-commit: No such file or directory. Спасибо, мне больше всего нравится ваше решение.
Этот сценарий git-autopush позволяет вам установить ловушку после фиксации, аналогично тому, что было рекомендовано в разделе « Как настроить автоматическое продвижение? ».
Но для парольной фразы вам нужно запустить файлssh-agent .
ssh-agent, просто использовать другую фразу-менее git-только ssh-key: ssh-keygen -t ed25519 -f ~/.ssh/id_pushonly. echo $'\nHost pushonly\nHostname DESTINATION\nIdentityFile ~/.ssh/id_pushonly\n' >> ~/.ssh/config. НаDESTINATION настройке, git-shellкак показано в superuser.com/a/444899/72223, используя pubkey из ~/.ssh/id_pushonly.pub. Необходимый git-URL выглядит примерно так git@pushonly:path/to/repo.git. Для отладки: ssh git@pushonly COMMANDнеобходимо запустить git-shell -c COMMANDна DESTINATION. Для COMMANDсмman git-shell
-t ed25519? Я обычно использую -t rsa, хотя в последнее время мне приходится добавлять -m PEMв ssh-keygen( stackoverflow.com/a/53645530/6309 , stackoverflow.com/a/53729009/6309 ).
ed25519потому что он дает короткие и удобные строки для ~/.ssh/authorized_keys. Также очень интересно, что DJB пишет о ed255519 : Защита от побочных каналов (Spectre), меньшего количества ЦП и т. Д. Кстати, когда sshdя имею дело со старыми s, я обычно создаю для них специальный ключ, а затем настраиваю его в ~/.ssh/config.
Вот простая инструкция по нажатию / вытягиванию без предоставления парольной фразы по ssh для людей, использующих Linux и Windows (git bash)
На вашем клиенте:
Проверьте, сгенерированы ли у вас ssh-ключи:
$ ls ~/.ssh/id_rsa.pub; ls ~/.ssh/id_dsa.pub
/c/Users/Cermo/.ssh/id_rsa.pub <-- I have RSA key
ls: cannot access '/c/Users/Cermo/.ssh/id_dsa.pub': No such file or directory
Если у вас нет ключа (две строки «ls: cannot access ...»), создайте новый. Если у вас есть какие-либо ключи, пропустите этот шаг.
$ ssh-keygen.exe
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Cermo/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): <-- press Enter
Enter same passphrase again: <-- press Enter
Скопируйте свой ключ на удаленный сервер, с которого вы хотите получить или отправить, используя git:
$ ssh-copy-id user_name@server_name
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to
filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you
are prompted now it is to install the new keys
user_name@server_name's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'user_name@server_name'"
and check to make sure that only the key(s) you wanted were added.
Примечание. Во время этой операции вам потребуется ввести пароль. После этого ваши операции pull / push не будут запрашивать пароль.
Примечание 2: вы должны войти на сервер, используя имя_пользователя хотя бы один раз, прежде чем использовать эту процедуру (домашний каталог, в который копируются ключи ssh, создается при первом входе в систему)
Вот сценарий bash для git для автоматического перехода pushк удаленному репо
$ cd /path/to/your/repository тогда$ pushПоместите этот скрипт в файл, например $HOME/.ssh/push
#!/bin/bash
# Check connection
ssh-add -l &>/dev/null
[[ "$?" == 2 ]] && eval `ssh-agent` > /dev/null
# Check if git config is configured
if [ ! $(git config user.name) ]
then
git config --global user.name <user_name>
git config --global user.email <user_email>
fi
# Check if expect is installed
if [[ ! $(dpkg -l | grep expect) ]]
then
apt-get update > /dev/null
apt-get install --assume-yes --no-install-recommends apt-utils expect > /dev/null
fi
# Check identity
ssh-add -l &>/dev/null
[[ "$?" == 1 ]] && expect $HOME/.ssh/agent > /dev/null
# Clean and push repo
REMOTE=$(git remote get-url origin)
URL=git@github.com:${REMOTE##*github.com/}
[[ $REMOTE == "http"* ]] && git remote set-url origin $URL
git add . && git commit -m "test automatically push to a remote repo"
git status && git push origin $(git rev-parse --abbrev-ref HEAD) --force
Свяжите его с /binкаталогом, чтобы его можно было вызвать просто $ pushкомандой
$ sudo ln -s $HOME/.ssh/push /bin/push
$ chmod +x /bin/push
Если вы используете Husky, он post-commitпо умолчанию перезапишет ваш файл хуков.
Мы используем эту команду в package.json для автоматической перебазировки и отправки любых коммитов в master. (Первый запуск yarn add --dev git-branch-is.)
"husky": {
"hooks": {
"post-commit": "git-branch-is master && git rebase origin master && git push origin master"`
}
}