如何在每次提交到本地仓库后将git设置为自动推送到远程仓库(包括自动提供密码)?
答案 0 :(得分:123)
首先,确保您可以在不提供密码的情况下手动推送。如果您要推送HTTP或HTTPS,则会出现creating a .netrc
file with the login details或adding your username and password into the URL for the remote。如果您使用的是SSH,则可以创建私钥没有密码的密钥对,或use ssh-agent
to cache your private key。
然后你应该在chmod +x
中创建一个包含以下内容的可执行文件(.git/hooks/post-commit
):
#!/bin/sh
git push origin master
...如果您要推送到origin
以外的其他遥控器,或者推送master
以外的分支,请自定义该行。确保您使该文件可执行。
答案 1 :(得分:27)
如果您开始使用多个主分支,则可能需要自动推送当前分支。我的钩子(.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 = 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_mobiles post-commit hook]"
echo
git push origin $branch_name;
fi
fi
如果可以使用git symbolic-ref确定分支名称,则会推送当前分支。
“How to get current branch name in Git?”处理此方法以及获取当前分支名称的其他方式。
在您期望发生sausage making的任务分支中工作时,每个分支的自动推送可能会令人不安(在推送后您将无法轻松地进行折扣)。因此钩子不会推动以定义的后缀结尾的分支(在示例“_local”中)。
答案 2 :(得分:8)
在.git / hooks目录中创建一个名为“post-commit”的文件,其内容为“git push”,但如果您想自动提供密码,则需要进行修改。
答案 3 :(得分:3)
此git-autopush脚本允许您设置提交后挂钩,类似于“How configure automatic pushing?”中建议的挂钩。
但是对于密码,您需要run a ssh-agent
。
答案 4 :(得分:0)
以下是推送/拉取的简单说明,不为使用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密钥的主目录)
答案 5 :(得分:0)
这是git的bash脚本,可自动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
答案 6 :(得分:0)
如果您使用的是Husky,则默认情况下它将覆盖post-commit
挂钩文件。
我们在package.json中使用此命令来自动对所有提交提交进行重新设置和推送。 (首先运行yarn add --dev git-branch-is
。)
"husky": {
"hooks": {
"post-commit": "git-branch-is master && git rebase origin master && git push origin master"`
}
}
答案 7 :(得分:0)
创建一个 git 文件:- commit.sh
#!/bin/sh
cd c:/Users/Lenovo/Desktop/nalms/src
git add --all
timestamp() {
date +"at %H:%M:%S on %d/%m/%Y"
}
git commit -am "Regular auto-commit $(timestamp)"
git push origin master
打开窗口任务调度器
创建新任务
常规 -> 为任务命名
转到触发器部分启用任务调度程序
按下完成按钮