【问题标题】:How can I guess the last time a repository was fetched/pulled from a remote?我如何猜测上次从远程获取/拉取存储库的时间?
【发布时间】:2014-10-02 04:59:12
【问题描述】:

我在其他一些人使用的 git 存储库中有一些愚蠢的 bash 脚本。这些是在我无法控制的客户端上运行的,但我想鼓励用户让它们保持最新状态,而不是每次都强制用户连接到远程。

Bash 伪代码是这样的:

if [[ thirty_days_ago < date_of_last_fetch ]] then;
   echo "Warning, these scripts are more than 30 days old.  You should try a git pull"
fi

我已经进行了一些搜索,但还没有找到可以运行的命令或可以读取其 mtime 以指示用户最后一次检查遥控器的文件。如果这是一个选项,我更喜欢它可以在每个遥控器上使用,但我会尽我所能。

【问题讨论】:

  • 在 bash 脚本中可能很难,但git log 会显示提交时间。

标签: git bash


【解决方案1】:

执行此操作的最简单方法是使用脚本为它们执行提取/拉取,并手动将时间记录在.git 目录中的文件中。

您也可以使用最后一次上游提交的时间作为粗略的衡量标准。

if [ "$(git log -1 --format=%ct origin/master)" -lt "$(date -d'30 days ago' +%s)" ]; then
    echo 'Warning....'
fi

【讨论】:

    【解决方案2】:

    文件

    .git/refs/remotes/remotename/branchname
    

    每次获取分支时都会更新。检查它的 mtime。

    如果要检查远程分支是否已合并到本地分支中,可以检查“remotename/branchname”和“branchname”的 refs 是否相等:

    getref='git log --format="%H" -n 1'
    if [ `$getref remotename/branchname` != `$getref branchname` ] ; then
        echo "the local branch and the remote branch diverged! Please pull!"
    fi
    

    【讨论】:

      【解决方案3】:

      我结合了一些使用stat [OS dependent flags] .git/FETCH_HEAD 的解决方案,在下面的链接答案中获取该文件的modified time

      每次获取时都会更新,无论是否获取任何内容

      https://stackoverflow.com/a/54264210/622276

      这个 sn-p 是我为自己维护的 bash prompt git integration 的一部分,但请随意窃取 sn-ps。

      # No repo == no more work 
      local REPO_ROOT=`git rev-parse --show-toplevel 2> /dev/null`
      if [[ -n $REPO_ROOT && -e "$REPO_ROOT/.git/FETCH_HEAD" ]]; then
      
          case $OSTYPE in
            darwin*)
              local LAST_FETCH="$(stat -f '%m' $REPO_ROOT/.git/FETCH_HEAD)" 
              local FETCH_THRESHOLD="$(date -v-15m +%s)"  
            ;;
            *)
              local LAST_FETCH="$(stat -c %Y $REPO_ROOT/.git/FETCH_HEAD)" 
              local FETCH_THRESHOLD="$(date -d'15 minutes ago' +%s)"  
            ;;
          esac
      
          # Fork fetch process in background
          if [[ $LAST_FETCH -lt $FETCH_THRESHOLD ]]; then
            git fetch --all --quiet --prune 2> /dev/null &
          fi
      
      fi
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-17
        • 2018-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多