91

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

4

8 回答 8

155

首先,确保您可以在不提供密码的情况下手动推送。如果您通过 HTTP 或 HTTPS 推送,则需要创建一个.netrc包含登录详细信息的文件,或者将您的用户名和密码添加到远程的 URL 中。如果您使用的是 SSH,您可以在私钥没有密码的情况下创建一个密钥对,或者用于ssh-agent缓存您的私钥

然后您应该在其中创建一个可执行 ( chmod +x) 文件,.git/hooks/post-commit其中包含以下内容:

#!/bin/sh
git push origin master

...如果您想推送到除 . 之外的远程origin,或推送除master. 确保使该文件可执行。

于 2011-10-28T06:32:17.633 回答
34

如果您开始使用多个 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”)。

于 2015-01-20T10:24:24.557 回答
10

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

于 2011-10-28T06:32:33.460 回答
3

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

于 2011-10-28T06:32:22.040 回答
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: cannot access ...”行),请生成一个新密钥。如果您有任何密钥,请跳过此步骤。

    $ 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 密钥复制到的主目录)。

于 2016-08-24T20:42:38.203 回答
0

这是 Git 自动push到远程存储库的 Bash 脚本

  1. 自动检查ssh-agent
  2. 使用期望脚本自动发送密码
  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 the repository
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
于 2019-08-05T21:02:47.920 回答
0

如果你使用的是 Husky,它会post-commit默认覆盖你的 hooks 文件。

我们在 package.json 中使用这个命令来自动 rebase 并推送任何提交给 master。(第一次运行yarn add --dev git-branch-is。)

  "husky": {
    "hooks": {
     "post-commit": "git-branch-is master && git rebase origin master && git push origin master"`
    }
  }
于 2020-07-22T16:46:58.607 回答
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. 按下Done按钮

于 2021-04-16T12:48:43.917 回答