首页 > 解决方案 > Git跨分支检查文件内容

问题描述

我目前正在使用以下两个 bash 函数对我们的 git 存储库进行分块,以确定每个分支上的最新版本号。由于我们有几个 git 钩子,包括 post-checkout,所以该gitTrackAll函数可能需要很长时间才能运行。有没有办法在不检查每个分支、将其拉入然后运行 ​​git show 的情况下做我正在做的事情?

为了澄清,我目前正在检查每个分支并获取 VERSION 文件的内容。这基本上告诉我合并到该分支的最后一个版本是什么。我们偶尔会有一些分支在开发人员处理它们时停滞不前。此列表为我们提供了一种快速查看背后的方法。

gitTrackAll && gitBranchVersions

function gitTrackAll(){
        remote='origin';
        for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD| awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do
            git checkout "$brname"
            git branch --set-upstream-to $remote/$brname $brname;
            git pull
        done
        git checkout master
}

function gitBranchVersions(){
        line='--------------------------------------------------------------------------------'
        line="$line$line"
        for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
                VER=$(git show "$branch":VERSION);
                printf "%s %s $VER\n" $branch "${line:${#branch}}"
        done
}

生成的输出看起来有点像以下(分支名称已更改)

refs/heads/1954-branch-a ---------------------------------------------------------------------------------------------------------------------------------------- 2.9.27
refs/heads/1955-branch-b ---------------------------------------------------------------------------------------------------------------------------------------- 2.9.43
refs/heads/1965-branch-c ---------------------------------------------------------------------------------------------------------------------------------------- 2.9.32
refs/heads/1968-branch-d ---------------------------------------------------------------------------------------------------------------------------------------- 2.9.101
refs/heads/1969-branch-e ---------------------------------------------------------------------------------------------------------------------------------------- 2.9.114
refs/heads/master ----------------------------------------------------------------------------------------------------------------------------------------------- 2.9.115

标签: bashgit

解决方案


我会gitTrackAll在没有任何结帐的情况下重写以下方式:

function gitTrackAll(){
        remote='origin';
        for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD| awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do
            git branch --set-upstream-to $remote/$brname $brname;
            # git fetch cannot update the current branch - use git pull
            git fetch $remote $brname:$brname || git pull $remote $brname
        done
}

推荐阅读