#!/bin/bash
file=$1
base=${2:-master}
b=$(tput bold) # Pretty print
n=$(tput sgr0)
echo "Searching for branches with changes to $file related to the $base branch"
# We look through all the local branches using plumbing
for branch in $(git for-each-ref --format='%(refname:short)' refs/heads/); do
# We're establishing a shared ancestor between base and branch, to only find forward changes.
merge_base=$(git merge-base $base $branch)
# Check if there are any changes in a given path.
changes=$(git diff $merge_base..$branch --stat -- $file)
if [[ ! -z $changes ]]; then
echo "Branch: ${b}$branch${n} | Merge Base: $merge_base"
# Show change statistics pretty formatted
git diff $merge_base..$branch --stat -- $file
fi
done
5条答案
按热度按时间9ceoxa921#
查找包含FILENAME更改的所有分支(即使在(未记录的)分支点之前)
手动检查:
查找未合并到主文件的对FILENAME的所有更改:
6jjcrrmo2#
你只需要
如果你想马上知道分支,你也可以用途:
此外,如果您有任何重命名,您可能希望在Git log命令中包含
--follow
。rjjhvcjd3#
看起来这仍然是一个没有适当解决方案的问题。我没有足够的学分来评论,所以这是我的一点贡献。
Seth Robertson的第一个解决方案对我来说有点管用,但只给了我本地分支,其中有许多误报,可能是因为稳定分支的合并。
Adam Dymitruk的第二个解决方案对我根本不起作用。对于初学者,--format =%5是什么?它不被git识别,我找不到任何关于它的信息,我无法让它与其他格式选项一起工作。
但他的第一个解决方案结合了--source选项和一个简单的grep,证明是有用的:
这给了我许多远程标记和分支以及一个本地分支,我在其中对文件进行了最新的更改。我不知道这有多完整。
首先,可以将grep改为"refs/heads/. *",这将只提供本地分支。如果只有几个分支,你可以像这样检查每个分支的最新提交:
如果有更多的分支,并且你真的想自动化,你可以使用xargs,git log格式化和另一种排序将这两个命令组合到这个一行程序中:
这将导致如下输出:
tp5buhyn4#
我知道这个问题很古老,但在开发自己的解决方案之前,我一直在回到这个问题上。我觉得它更优雅,并且由于使用了合并基础过滤器来过滤不需要的分支。
如果将其作为
git-find-changes
(具有可执行权限)放在PATH中,则可以使用git find-changes /path
调用它git find-changes app/models/
的输出示例xggvc2p65#
下面是一个不优雅的蛮力方法,但我希望它应该工作。首先确保你已经隐藏了任何未提交的更改,因为它会切换你当前所在的分支。