如何解决如何为所有包括嵌套子模块显示带有 --name-only 的差异?
我知道如何对子模块进行差异化
git diff "$@"
然而,此差异仅显示超级项目的文件内容,而不显示子模块的文件内容。它显示每个新提交的子模块的新 sha1,但不显示它们的文件内容。
我知道如何使用更多细节进行差异化
git diff --submodule=diff "$@"
但是这个差异显示了超级项目及其子模块的所有文件内容
如果使用 --name-only 样式,我怎么能做到这一点?
git diff --name-only "$@"
和
git diff --name-only --submodule=diff "$@"
给出相同的结果
注意:我的命令不起作用的一个明显原因是缺乏实施。然而,git submodule foreach 可能有一些技巧,但这似乎不是直接的
注意:它应该是递归的(即比较子模块的子模块),如果您的解决方案包含“git submodule foreach”,那么它将是“git submodule --recursive foreach”。这是问题中最重要的部分,因为制作 git submodule foreach 并不难,但是 git submodule --recursive foreach 让我头疼
解决方法
#! /bin/sh
# See the discussion at https://stackoverflow.com/q/67724347/7976758
if [ -z "$1" ]; then
echo "Usage $0 from_commit [to_commit]"
exit 1
fi
if [ -z "$prog_dir" -o -z "$prog_name" ]; then
start_dir="`pwd`"
prog_dir="`dirname \"$0\"`"
prog_name="`basename \"$0\"`"
cd "$prog_dir"
# Get full path
prog_dir="`pwd`"
cd "$start_dir"
export prog_dir prog_name
fi
from_commit="$1"
to_commit="${2:-HEAD}"
export from_commit to_commit
# In the superproject
git --no-pager diff --name-only "$from_commit" "$to_commit"
git submodule foreach '
# In submodule "$name"
prev_commit=`(git -C "$toplevel" ls-tree "$from_commit" "$sm_path" | awk "{print \\$3}")`
curr_commit=`(git -C "$toplevel" ls-tree "$to_commit" "$sm_path" | awk "{print \\$3}")`
"$prog_dir/$prog_name" $prev_commit $curr_commit
'
,
recursivenameonlysubmodulediff() {
git update-ref refs/scratch/old $1
git update-ref refs/scratch/new $2
git diff --name-only scratch/old scratch/new
export realtop=$PWD
git submodule foreach -q --recursive '
git update-ref refs/scratch/old `git -C .. rev-parse scratch/old:$sm_path`
git update-ref refs/scratch/new `git -C .. rev-parse scratch/new:$sm_path`
prefix=$toplevel/$sm_path/
git diff --name-only scratch/old scratch/new | sed s,^,${prefix#$realtop/},'
}
将处理 russian-dolls-submodules 案例,使用 scratch
引用避免它们被无意中推送或获取。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。