在git中提交后如何自动推送?
如何将git设置为在每次提交到本地repo后自动推送到远程repo(包括自动提供我的密码?首先,确保您可以手动推送到,而无需提供密码。如果您正在通过HTTP或HTTPS进行推送,则会出现或的情况。如果您使用的是SSH,则可以在私钥没有密码的情况下创建密钥对,或者 然后,您应该在在git中提交后如何自动推送?,git,githooks,git-push,post-commit-hook,Git,Githooks,Git Push,Post Commit Hook,如何将git设置为在每次提交到本地repo后自动推送到远程repo(包括自动提供我的密码?首先,确保您可以手动推送到,而无需提供密码。如果您正在通过HTTP或HTTPS进行推送,则会出现或的情况。如果您使用的是SSH,则可以在私钥没有密码的情况下创建密钥对,或者 然后,您应该在.git/hooks/post commit中创建一个可执行文件(chmod+x),该文件包含以下内容: #!/bin/sh git push origin master 。。。如果您要推送至原点以外的远程位置,或推送主
.git/hooks/post commit
中创建一个可执行文件(chmod+x
),该文件包含以下内容:
#!/bin/sh
git push origin master
。。。如果您要推送至原点以外的远程位置
,或推送主机以外的分支
,请自定义该行。确保该文件可执行。此脚本允许您设置提交后钩子,类似于“.”中建议的内容。但是对于密码短语,您需要。在.git/hooks目录中创建一个名为“post commit”的文件,其内容为“git push”,但是如果您想自动提供密码,则需要进行修改。如果您开始使用多个主分支,则可能需要自动推送当前分支。我的钩子(
.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 symbol-ref确定分支名称,它将推送当前分支
“”处理此方法以及获取当前分支名称的其他方法
在任务分支中工作时,自动推送每个分支可能会让人感到不安,因为在任务分支中,您预计会发生一些情况(推送之后,您将无法轻松地重新设置基址)。因此钩子不会推动以定义的后缀结尾的分支(在示例中为“_local”) 下面是一个简单的推/拉指令,对于使用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
注2:在使用此过程之前,您必须使用用户名至少登录服务器一次(ssh密钥复制到的主目录是在首次登录时创建的)下面是git自动将
推送到远程repo的bash脚本
自动检查
使用自动发送密码短语
用法很简单:$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
如果您使用的是Husky,默认情况下它将覆盖您的post-commit
hooks文件
我们在package.json中使用这个命令来自动重新设置基础并将任何提交推送到master。(第一次运行纱线添加--dev git分支是)
创建git文件:-commit.sh
#/垃圾箱/垃圾箱
cd c:/Users/Lenovo/Desktop/nalms/src
git add--all
时间戳(){
日期+“在%d/%M/%Y的%H:%M:%S”
}
git commit-am“常规自动提交$(时间戳)”
git推送源主机
打开窗口任务调度程序
创建新任务
常规->命名任务
转到触发器部分启用任务计划程序
按“完成”按钮
你在推行什么协议?如果提示输入密码,我假设这是SSH或HTTP。另外,git问题总是很有帮助的,至少要提到您使用的是什么操作系统。我怀疑这样设置是否明智。这将删除将更改重新组织为不同提交集(尤其是重定基址)的任何功能。我犯了太多的错误,这样的设置最终对我有用。如果可以的话,我会投票给马克·朗盖尔。等等,什么?科林R现在在前2%:)无法让ssh代理记住我的密码短语,所以必须将其设置为空。希望我的妻子不会侵入我的账户:)说到定制,如果我想以这种方式推广一些分支机构,而不是所有分支机构,该怎么办?例如,我只想自动推送那些在.git/config
中标注了前缀为feature/xy/
.git-push的相应远程分支——所有originchmod+x.git/hooks/post-commitIf如果您不想存储密码,那么这种方法也可以很好地工作。每次提交后唯一的一件事就是你必须输入密码。第一行,我必须使用#/bin/sh
使其工作。否则它会一直说:错误:无法运行。git/hooks/post-commit:没有这样的文件或目录
。谢谢,我最喜欢你的解决方案。谢谢你的评论,@oyalhi,我更新了答案中的shebang行。现在应该更好了!您好,我遇到了这个错误:.git/hooks/post commit:第3行:在查找匹配的“``”时出现意外的EOF。git/hooks/post commit:第17行:语法错误:意外的文件结尾嘿,确实丢失了回勾。我更新了答案,请再试一次。他们不需要ssh代理
,只需使用另一个密码短语git
-仅ssh
-密钥:ssh-keygen-t ed25519-f~/.ssh/id\u pushonly
<代码>echo$'\nHost pushonly\nHostname DESTINATION\nIdentityFile~/.ssh/id\u pushonly\n'>>~/.ssh/config
。在DESTINATION
上配置git shell
,如使用~/.ssh/id\u pushonly.pub
中的pubkey所示。所需的git
-URL类似于git@pushonly:path/to/repo.git
。调试:sshgit@pushonly命令
必须在目标
上运行git shell-c命令
。有关命令
的信息,请参阅mangitshell
@Tino谢谢。为什么要使用数字签名方案-t ed25519
?我通常使用-t rsa
,尽管最近我不得不将-m PEM
添加到ssh keygen
(,)。@t我不知道rsa速度较慢,安全性较低(如果它的长度小于2048位:),但我在工作中使用的是较旧的
$ 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.
#!/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
$ sudo ln -s $HOME/.ssh/push /bin/push
$ chmod +x /bin/push
"husky": {
"hooks": {
"post-commit": "git-branch-is master && git rebase origin master && git push origin master"`
}
}