Як встановити 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/
.
Якщо ви починаєте використовувати більше, ніж головна гілка, можливо, ви захочете автоматично натиснути поточну гілку. Мій хук ( .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
. Дякую, мені найбільше подобається ваше рішення.
Створіть файл із назвою "post-commit" у каталозі .git / hooks із вмістом "git push", хоча якщо ви хочете автоматично ввести пароль, значить буде потрібно модифікація.
Цей скрипт 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
-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: не можу отримати доступ ..."), створіть новий. Якщо у вас є будь-яка з клавіш, пропустіть цей крок.
$ 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.
Примітка. Під час цієї операції вам доведеться вказати пароль. Після цього ваші операції витягування / натискання не будуть запитувати пароль.
Примітка2: Вам потрібно ввійти на сервер за допомогою user_name принаймні один раз перед використанням цієї процедури (домашній каталог, до якого копіюються ключі 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"`
}
}