每次提交到本地存储库后,如何设置git自动推送到远程存储库(包括自动提供我的密码短语)?
每次提交到本地存储库后,如何设置git自动推送到远程存储库(包括自动提供我的密码短语)?
Answers:
首先,请确保无需输入密码即可手动推送。如果要通过HTTP或HTTPS进行推送,则可能是使用登录详细信息创建.netrc
文件,或者将用户名和密码添加到remote的URL中。如果您使用的是SSH,则可以在私钥没有密码的情况下创建密钥对,也可以ssh-agent
用于缓存私钥。
然后,您应该在其中创建一个包含以下内容的可执行文件(chmod +x
).git/hooks/post-commit
:
#!/bin/sh
git push origin master
...如果您要推送到除之外的其他远程服务器origin
或推送到以外的其他分支,请自定义该行master
。确保使该文件可执行。
.git/config
前缀的远程分支的分支feature/xy/
。
如果您开始使用的分支多于master分支,则可能需要自动推送当前分支。我的钩子(.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
-键: 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),CPU减少等。顺便说一句,在处理旧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密钥复制到的主目录)
这是git的bash脚本,可以自动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