Как автоматически нажимать после фиксации в git?

86

Как мне настроить git на автоматическую отправку в удаленное репо (включая автоматическое предоставление моей парольной фразы) после каждой фиксации в локальном репо?

улу
источник
1
Какой протокол вы продвигаете? Если он запрашивает пароль, я предполагаю, что это либо SSH, либо HTTP.
Марк Лонгэр
1
Кроме того, в вопросах о git всегда полезно хотя бы упомянуть, какую операционную систему вы используете.
Марк Лонгэр
1
Я сомневаюсь в целесообразности такой установки. Это исключает любую возможность реорганизовать ваши изменения в другой набор коммитов (особенно с перебазированием). Я делаю слишком много ошибок, чтобы подобная установка оказалась для меня полезной.
jpmc26,

Ответы:

141

Во-первых, убедитесь, что вы можете нажать вручную, не вводя пароль. Если вы используете HTTP или HTTPS, это будет случай либо создания .netrcфайла с данными для входа в систему, либо добавления вашего имени пользователя и пароля в URL-адрес для удаленного . Если вы используете SSH, вы можете создать пару ключей, в которой закрытый ключ не имеет пароля, или использовать ssh-agentдля кеширования своего закрытого ключа .

Затем вы должны создать исполняемый ( chmod +x) файл .git/hooks/post-commit, содержащий следующее:

#!/bin/sh
git push origin master

... настраивая эту строку, если вы хотите отправить на удаленный компьютер, отличный от origin, или отправить ветку, отличную от master. Убедитесь, что вы сделали этот файл исполняемым.

Марк Лонгэр
источник
3
Не удалось заставить ssh-agent запомнить мою кодовую фразу, поэтому пришлось сделать его пустым. Надеюсь, моя жена не взломает мой аккаунт :)
ulu
Говоря о настройке, что, если я захочу таким образом подтолкнуть некоторые, но не все ветки? Например, я хочу автоматически нажимать только те ветки, у которых есть соответствующая удаленная ветка, отмеченная .git/configпрефиксом feature/xy/.
Acumenus
5
git push --all origin
Яда
4
chmod + x .git / hooks / post-commit
UnchartedWorks
33

Если вы начнете использовать больше, чем основную ветку, вы можете автоматически нажать текущую ветвь. Мой 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").

i4h
источник
Для первой строки мне пришлось использовать, #!/bin/shчтобы она работала. В противном случае он твердил: error: cannot run .git/hooks/post-commit: No such file or directory. Спасибо, мне больше всего нравится ваше решение.
oyalhi
Спасибо за комментарий, @oyalhi, я обновил строку shebang в ответе. Теперь он должен портироваться лучше!
i4h
привет, я получаю эту ошибку: .git / hooks / post-commit: line 3: неожиданный EOF при поиске соответствия `` '.git / hooks / post-commit: line 17: синтаксическая ошибка: неожиданный конец файла
Тобиас,
Эй, действительно была потеряна обратная кавычка. Я обновил ответ, попробуйте еще раз
i4h
9

Создайте файл с именем «post-commit» в каталоге .git / hooks с содержимым «git push», хотя, если вы хотите автоматически предоставить пароль, потребуется модификация.

Колин Р
источник
Я бы upvote Марка Longair в ответ , если бы мог.
Colin R
1
Чего ждать? Colin R теперь в топ-2% :)
Post Self
3

Этот сценарий git-autopush позволяет вам установить ловушку после фиксации, аналогично тому, что было рекомендовано в разделе « Как настроить автоматическое продвижение? ».
Но для парольной фразы вам нужно запустить файлssh-agent .

VonC
источник
Там нет необходимости 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
Tino
@Tino Спасибо. Почему вы используете схему цифровой подписи -t ed25519? Я обычно использую -t rsa, хотя в последнее время мне приходится добавлять -m PEMв ssh-keygen( stackoverflow.com/a/53645530/6309 , stackoverflow.com/a/53729009/6309 ).
VonC
@Tino Я понимаю, что rsa медленнее, менее безопасен (если его длина меньше 2048 бит: bagja.net/blog/upgrade-ssh-key-to-ed25519.html ), но я имею дело со старыми серверами openssh, которые могут не правильно интерпретировать подпись ed255519.
VonC
Я в первую очередь использую, ed25519потому что он дает короткие и удобные строки для ~/.ssh/authorized_keys. Также очень интересно, что DJB пишет о ed255519 : Защита от побочных каналов (Spectre), меньшего количества ЦП и т. Д. Кстати, когда sshdя имею дело со старыми s, я обычно создаю для них специальный ключ, а затем настраиваю его в ~/.ssh/config.
Тино
0

Вот простая инструкция по нажатию / вытягиванию без предоставления парольной фразы по ssh для людей, использующих Linux и Windows (git bash)

На вашем клиенте:

  1. Проверьте, сгенерированы ли у вас 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
    
  2. Если у вас нет ключа (две строки «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
    
  3. Скопируйте свой ключ на удаленный сервер, с которого вы хотите получить или отправить, используя 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, создается при первом входе в систему)

Рафал Гнитецкий
источник
0

Вот сценарий bash для git для автоматического перехода pushк удаленному репо

  1. Автоматически проверять ssh-agent
  2. Автоматически отправлять парольную фразу с помощью сценария ожидания
  3. Использование просто: $ 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
Четабахана
источник
0

Если вы используете 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"`
    }
  }
Freewalker
источник