如何在git中提交后自动推送?

时间:2011-10-28 06:25:44

标签: git githooks git-push post-commit-hook

如何在每次提交到本地仓库后将git设置为自动推送到远程仓库(包括自动提供密码)?

8 个答案:

答案 0 :(得分:123)

首先,确保您可以在不提供密码的情况下手动推送。如果您要推送HTTP或HTTPS,则会出现creating a .netrc file with the login detailsadding 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)

在您的客户端:

  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.
    
  4. 注意:您必须在此操作期间提供密码。之后,您的拉/推操作将不会请求密码。

    注意2:在使用此过程之前,必须至少使用user_name登录服务器一次(首次登录时创建复制ssh密钥的主目录)

答案 5 :(得分:0)

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

  1. 自动检查ssh-agent
  2. 使用expect script自动发送密码短语
  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

答案 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)

  1. 创建一个 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
    
  2. 打开窗口任务调度器

  3. 创建新任务

  4. 常规 -> 为任务命名

  5. 转到触发器部分启用任务调度程序

  6. 按下完成按钮