【问题标题】:How to update a local repository automatically with the remote?如何使用远程自动更新本地存储库?
【发布时间】:2021-09-11 20:03:49
【问题描述】:

我在 GitHub 上创建了一个存储库,其中包含我和我的团队正在使用的一堆 bash 脚本。但是,我想确保他们始终使用最新的脚本。 每当我对遥控器进行更新时,我发现自己打电话给他们告诉他们从遥控器上拉动。这似乎效率很低。

我无休止地浏览互联网寻找解决方案 - 某种 PC 工具(我们使用 Windows),它会自动检查本地 repo 是否是最新的,如果不是,它会自动从远程提取。

我找不到任何东西,所以如果有人对此有解决方案,我将不胜感激。

【问题讨论】:

  • Git 是一个有助于开发的版本控制工具。您正在使用它进行部署/分发,有一些与 Git 无关的部署和分发工具和策略可能会解决您的问题。
  • @choroba 您对此类部署工具有什么建议吗?我很乐意学习...谢谢。

标签: bash git


【解决方案1】:

我最终为自己创建了一个不完全是我想要的解决方案,但确实为我解决了问题:

我刚刚向 repo 中的所有脚本介绍了对一个函数的调用,该函数仅检查 repo 是否与远程同步。如果不是,它不会让脚本继续并且脚本中止,迫使用户在运行脚本之前从远程拉取。所以这样一来,我知道没有人会使用我的脚本的过时版本。

这是我使用的脚本(我将它与所有其他 bash 脚本一起放在 repo 中名为 GlobalFunctions.sh 的文件中):

#!/bin/bash
#------------------------------------------------------
# GlobalFunctions.sh
# Description:
# This file is supposed to serve as a file for global bash script functions that could be used by multiple files. 
#-------------------------------------------------------------

#verify that the repository containing the scripts is up-to-date
function CheckScriptsValidity()
{
    # DIRECTORY WHERE THE SCRIPT IS LOCATED
    SCRIPT_DIRECTORY="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
    
    # CURRENT DIRECTORY
    ORIGINAL_DIRECTORY=$(pwd)
    
    cd $SCRIPT_DIRECTORY
    
    git fetch  #update the branch origin/main
    if [[ -z $(git diff origin/main..HEAD) ]]   # if the current location (HEAD) is at the same location as the remote main branch
    then
        echo "Scripts Repo is up to date."
    else
        echo "Scripts Repo is not up to date with remote. Please pull Scripts repo from remote. Aborting..."
        read -p "Press enter to continue..."
        exit 0
    fi
    
    cd $ORIGINAL_DIRECTORY
}

CheckScriptsValidity        #Verify that the repository containing the scripts is up-to-date

在每个 bash 脚本文件中,我只是在顶部添加了这一行:

source $(dirname "$0")/GlobalFunctions.sh   #Load script file so that we can call its functions (path defined based on this: https://stackoverflow.com/a/42101141/4441211)

【讨论】:

  • 1. git diff origin/main 不与远程存储库进行比较;您需要先运行git fetch 以从远程更新本地存储库。 2. 不需要使用..HEADgit diff origin/main 完全一样。 3. 不用test -zgit diff返回退出码1,如果有差异,你可以做if git diff -q origin/main; then
  • 4.如果代码检测到origin 中的脚本已更改,则代码可以在cd $ORIGINAL_DIRECTORY 之后使用exec(带有所有参数)更新当前脚本,从而实现您从一开始就提出的要求——更新脚本自动.
  • @phd 感谢您的第一条评论。你说得对,我忘了写 fetch。我会更新我的答案。您能否详细说明您的第二条评论?我找不到任何将 exec 用于您提到的目的的示例。谢谢
  • @phd 经过一些测试,我发现将..HEAD 添加到 diff 命令和不使用它之间存在细微差别。主要区别在于,如果您确实包含..HEAD,那么它将与当前结帐头进行比较,而不是与您拥有的任何未提交的更改进行比较。这很重要,因为当我对脚本进行更改和测试时,我希望能够运行它们。如果我删除了..HEAD,那么我会一直不符合条件,并且无法在提交脚本之前运行它们。所以对我来说,我将在脚本中保留..HEAD
  • exec 在 shell 中的意思是“用新进程替换当前进程”。因此,在更新磁盘上的脚本后,exec $0 $@ 会用存储库中的新代码替换当前脚本。
猜你喜欢
  • 2011-02-04
  • 2020-01-09
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 2020-04-21
  • 2015-04-14
相关资源
最近更新 更多