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

在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设置为在每次提交到本地repo后自动推送到远程repo(包括自动提供我的密码?

首先,确保您可以手动推送到,而无需提供密码。如果您正在通过HTTP或HTTPS进行推送,则会出现或的情况。如果您使用的是SSH,则可以在私钥没有密码的情况下创建密钥对,或者

然后,您应该在
.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提供密码短语

关于您的客户:

  • 检查是否生成了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"`
        }
      }