如何将 Git 设置为在每次提交到本地存储库后自动推送到远程存储库(包括自动提供我的密码)?
8 回答
首先,确保您可以在不提供密码的情况下手动推送。如果您通过 HTTP 或 HTTPS 推送,则需要创建一个.netrc
包含登录详细信息的文件,或者将您的用户名和密码添加到远程的 URL 中。如果您使用的是 SSH,您可以在私钥没有密码的情况下创建一个密钥对,或者用于ssh-agent
缓存您的私钥。
然后您应该在其中创建一个可执行 ( chmod +x
) 文件,.git/hooks/post-commit
其中包含以下内容:
#!/bin/sh
git push origin master
...如果您想推送到除 . 之外的远程origin
,或推送除master
. 确保使该文件可执行。
如果您开始使用多个 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”)。
在.git/hooks目录中创建一个名为“post-commit”的文件,其内容为“git push”。但是,如果您想自动提供密码,则需要进行修改。
这个git-autopush脚本允许你设置一个 post-commit 钩子,类似于“如何配置自动推送? ”中推荐的。
但是对于密码,您需要运行ssh-agent
.
这里是推/拉的简单说明,无需通过 SSH 为使用 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: 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
将您的密钥复制到您要使用 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 密钥复制到的主目录)。
这是 Git 自动push
到远程存储库的 Bash 脚本
将此脚本添加到文件中,例如$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
如果你使用的是 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"`
}
}
创建一个 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
打开窗口任务计划程序
创建新任务
常规→ 命名任务
转到触发器部分并启用任务计划程序
按下Done按钮