Как мне настроить 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"`
}
}