bash - Git 跨分支检查文件内容

标签 bash git

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

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

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

最佳答案

我会用下面的方式重写 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
}

关于bash - Git 跨分支检查文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50236392/

相关文章:

android - bash 脚本中的 adb 命令(将 sqlite 从 android 复制到 mac)

regex - 在 bash 中批量文件重命名,删除带空格的名称,留下尾随数字

bash - 将历史文件中的哈希标记时间戳转换为所需的字符串

ios - Git 大文件存储 - 远程 : fatal: pack exceeds maximum allowed size

git - 如何 "pull request"一个特定的提交

bash - 使用 bash 查找包含字符串的第一个文件夹名称

linux - 使用 BASH 最多排列 N 个字母

git - 使用 git 信息生成 git.properties 文件

linux - Git 初始推送错误文件描述符错误

Git fatal error : pack has bad object at offset X: inflate returned -5