Як автоматично натискати після фіксації в git?


84

Як встановити git для автоматичного переходу до віддаленого репо (включаючи автоматичне надання моєї парольної фрази) після кожного коміту до локального репо?


1
Який протокол ти штовхаєш? Якщо він запитує пароль, я припускаю, що це або SSH, або HTTP.
Mark Longair

1
Крім того, завжди корисно з питаннями git хоча б згадати, яку операційну систему ви використовуєте.
Mark Longair

1
Я сумніваюся в мудрості такої організації. Це позбавляє будь-якої можливості реорганізувати ваші зміни в інший набір комітів (перебазування, особливо). Я роблю занадто багато помилок, щоб подібне налаштування могло стати для мене корисним.
jpmc26,

Відповіді:


139

По-перше, переконайтеся, що ви можете натискати вручну, не вказавши свій пароль. Якщо ви натискаєте на 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/.
Проникність

5
git push
Яда

4
chmod + x .git / hooks / post-commit
UnchartedWorks

33

Якщо ви починаєте використовувати більше, ніж головна гілка, можливо, ви захочете автоматично натиснути поточну гілку. Мій хук ( .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. Дякую, мені найбільше подобається ваше рішення.
oyalhi

Дякую за коментар, @oyalhi, я оновив рядок shebang у відповіді. Зараз він повинен портувати краще!
i4h

привіт, я отримую цю помилку: .git / hooks / post-commit: рядок 3: несподіваний EOF під час пошуку відповідності `` .git / hooks / post-commit: рядок 17: синтаксична помилка: несподіваний кінець файлу
wwwwwwwwwwww

Гей, справді був загублений зворотний удар. Я оновив відповідь, будь ласка, спробуйте ще раз
i4h

9

Створіть файл із назвою "post-commit" у каталозі .git / hooks із вмістом "git push", хоча якщо ви хочете автоматично ввести пароль, значить буде потрібно модифікація.


Я б upvote Марка Longair в відповідь , якби міг.
Colin R

1
Чекати, що? Колін Р зараз у топ-2% :)
Публікація Self

3

Цей скрипт git-autopush дозволяє встановити гачок після фіксації, подібно до того, що було рекомендовано в " Як налаштувати автоматичне натискання? ".
Але для парольної фрази вам потрібно запустити assh-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
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), менше центрального процесора тощо. До речі, маючи справу зі старими sshds, я зазвичай створюю для них спеціальний ключ, а потім налаштовую це в ~/.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: не можу отримати доступ ..."), створіть новий. Якщо у вас є будь-яка з клавіш, пропустіть цей крок.

    $ 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.
    

Примітка. Під час цієї операції вам доведеться вказати пароль. Після цього ваші операції витягування / натискання не будуть запитувати пароль.

Примітка2: Вам потрібно ввійти на сервер за допомогою user_name принаймні один раз перед використанням цієї процедури (домашній каталог, до якого копіюються ключі ssh, створюється під час першого входу)


0

Ось скрипт bash для git для автоматичного pushвіддаленого репо

  1. Автоматично перевіряти ssh-агент
  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"`
    }
  }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.