考虑在两个分叉的项目中查找已更改内容的任务。
diff -r
让我接近:它能够找到每个目标文件夹中缺少的文件,并指出通过展示差异而改变的文件。
我想使用自定义diff实用程序。我想不必在我的diff实用程序中实现递归目录行走逻辑。
所以,我基本上只是想要一个程序执行diff -r
所做的事情,但实际上并没有继续运行差异。
这样的事情存在吗?
答案 0 :(得分:1)
我认为diff -r
的输出已经足够结构化,足以让我“聪明”。这是它的要点。
diff -r proj1/src proj2/src | grep 'diff -r' | cut -d ' ' -f 3,4 | xargs -n 2 sift
其中sift
是我的小命令行基于字符的diff util,它围绕diff
的diff输出运行。
并使用diff (GNU diffutils) 2.8.1
我也愿意接受更优雅的解决方案!
修改:感谢@janos,-q
选项让它非常优秀!
最后要提到的是,通过在Mac的命令行中输入opendiff
程序(指定所需目录中的相应文件作为目标,这当然已经在Git repo,对吧?)手动合并很好很快。
事实上,当需要人工合并时,设置Git使用的opendiff
可能是最佳选择。
只是我仍然没有在同一个代码库中遇到很多合并冲突情况,它主要是在分配repos(并且对包含共享代码的不同项目有单独的repos)时我需要做这种合并手动使我的“主要”项目与战壕中所做的更改保持同步。
答案 1 :(得分:0)
我认为这更优雅:
diff -rq dir1 dir2 | sed -ne 's/^Files \(.*\) and \(.*\) differ$/\1\n\2/p' | xargs -n 2 sift
主要技巧是使用-q
标志,它将以简短格式打印差异,例如:
Files dir1/x and dir2/x differ
Only in dir1: path/to/file
Only in dir2: path/to/another
然后你如何解析输出是你的品味问题。
最后,要正确处理文件名中的空格:
diff -rq dir1 dir2 | sed -ne 's/^Files \(.*\) and \(.*\) differ$/sift "\1" "\2"/p' | sh
将它包装在函数中可能是有意义的:
xdiff() {
diff=$1; shift
dir1=$1; shift
dir2=$1; shift
diff -rq $dir1 $dir2 | sed -ne 's/^Files \(.*\) and \(.*\) differ$/'$diff' "\1" "\2"/p' | sh
}
所以你可以这样称呼它:
xdiff sift dir1 dir2