提交git后如何自动推送?


84

每次提交到本地存储库后,如何设置git自动推送到远程存储库(包括自动提供我的密码短语)?


1
您要执行什么协议?如果提示您输入密码,我假设它是SSH或HTTP。
马克·朗伊尔

1
另外,对于git问题总是至少对您使用的是什么操作系统很有帮助。
马克·朗伊尔

1
我对这种设置的智慧表示怀疑。这消除了将您的更改重新组织为一组不同的提交(尤其是重新设置)的能力。对于这样的设置,我犯了太多错误,最终对我没有用。
jpmc26 2016年

Answers:


139

首先,请确保无需输入密码即可手动推送。如果要通过HTTP或HTTPS进行推送,则可能是使用登录详细信息创建.netrc文件,或者将用户名和密码添加到remote的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/
Acumenus 2014年

5
git push --all origin
Yada

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

33

如果您开始使用的分支多于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。谢谢,我最喜欢您的解决方案。
oyalhi '16

感谢您的评论@oyalhi,我在回答中更新了shebang行。现在应该移植得更好!
i4h

你好,我得到这个错误:.git / hooks / post-commit:第3行:寻找匹配“'.git / hooks / post-commit:第17行:意外的EOF:语法错误:文件的意外末尾
wwwwwwwwwwww

嘿,确实有一个失败的背景。我更新了答案,请重试
i4h

9

在.git / hooks目录中创建一个名为“ post-commit”的文件,其内容为“ git push”,但是,如果要自动提供密码,则需要进行修改。


如果可以的话,我会支持马克·朗伊尔的回答
Colin R

1
等一下 Colin R现在排在前2%:)
自检发布时间为

3

这个git-autopush脚本允许您设置一个提交后的钩子,类似于“如何配置自动推送? ”中推荐的钩子。
但是,对于密码短语,您需要运行ssh-agent


有没有必要ssh-agent,只是使用另一个口令少git-只ssh-键: ssh-keygen -t ed25519 -f ~/.ssh/id_pushonlyecho $'\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。对于COMMANDman git-shell
蒂诺

@Tino谢谢。为什么要使用数字签名方案-t ed25519?我一般使用-t rsa,但最近我必须添加-m PEMssh-keygenstackoverflow.com/a/53645530/6309stackoverflow.com/a/53729009/6309)。
VonC

@Tino我知道rsa速度较慢,安全性较差(如果其长度小于2048位:bagja.net/blog/upgrade-ssh-key-to-ed25519.html),但是我在处理较旧的openssh服务器,无法正确解释ed255519签名。
VonC

我主要使用ed25519它,是因为它可以使简短明了~/.ssh/authorized_keysDJB撰写的有关ed255519的内容也非常有趣:防止侧边通道(Spectre),CPU减少等。顺便说一句,在处理旧sshds时,我通常为它们创建一个特殊的密钥,然后在中进行配置~/.ssh/config
Tino,

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

这是git的bash脚本,可以自动push发送到远程仓库

  1. 自动检查ssh-agent
  2. 使用Expect脚本自动发送密码
  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中使用此命令来自动对所有提交提交进行重新设置和推送。(首次运行yarn add --dev git-branch-is。)

  "husky": {
    "hooks": {
     "post-commit": "git-branch-is master && git rebase origin master && git push origin master"`
    }
  }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.