关于版本控制:在hg或git中的两个完整目录/项目之间进行区分?

Diffing between two entire directories/projects in hg or git?

我继承了最初存储在CVS中的项目以及所有修订版。 我做了很多编辑,我试图比较我在原始目录中所做的所有更改,关于添加的新文件与旧文件。

是否有某种实用的hg / git,我可以做一个树差异,或者那种性质的东西? 那么说,新添加的文件,删除的文件之间有标记,我要求的太多了吗?


只需从两个任意文件或目录中以git的diff格式创建diff补丁,而不需要任何花哨的存储库或版本控制:

1
git diff --no-index some/path other/path >> some_filename

Jakub Nar?bski对knittl答案的评论暗示了答案......为了简单起见,这就是完整的命令。

>>部分创建一个文件并将输出重定向到它。如果您不想要文件并且只想在控制台中打印输出以便复制它,只需删除>> some_filename部分即可。

为方便复制和粘贴,如果您已经cd编辑到包含名为a的原始目录/文件和修改后的目录b的目录,它将是:

1
git diff --no-index a b >> patch


git diff手册页:

git diff [--options] [--] [...]

[...]
If exactly two paths are given, and at least one is untracked, compare the two files / directories. This behavior can be forced by --no-index.

如果您想在两个不同的存储库中比较两个版本(例如两个标记版本或两个分支),您可以使用Git Wiki上的GitTips页面中描述的技巧,在"如何比较两个本地存储库"下。

假设您在一个存储库中,第二个存储库位于/path/to/repo中,因此如果它是非裸存储库,则其GIT_DIR为/path/to/repo/.git,您可以执行以下操作:

1
2
$ GIT_ALTERNATE_OBJECT_DIRECTORIES=/path/to/repo/.git/objects \
   git diff $(git --git-dir=/path/to/repo/.git rev-parse --verify A) B

其中A和B是您要比较的修订版。当然,您也可以在上面的表达式中指定路径限制器。

说明:GIT_ALTERNATE_OBJECT_REPOSITORIES变量可用于使git命令连接两个存储库的对象数据库。 git --git-dir=... rev-parse ...用于将作为参数提供的存储库中的名称(扩展SHA-1表达式)转换为唯一的SHA-1标识符git-dir选项。 $( ... )构造在命令行中调用给定命令的结果。 git diff用于比较两个修订版(其中一个来自备用对象存储库)。

替代解决方案是使用git remote add(和git fetch)将其他存储库导入到给定的存储库中。然后你就可以在本地获得所有东西,并且可以在单个存储库中进行比较。


Is there some sort of utility for hg/git where I can do a tree diff... ▼显示o that say, there's a mark between newly added files, deleted files... [emphasis added]

是。我们可以git diff当前目录对另一个目录和...

...标记添加,删除和修改的文件:

1
git diff --name-status --no-index ./ path/to/other/dir

...仅显示添加的文件:

1
git diff --diff-filter=A --name-status --no-index ./ path/to/other/dir

...仅显示已删除的文件:

1
git diff --diff-filter=D --name-status --no-index ./ path/to/other/dir

...仅显示已修改的文件:

1
git diff --diff-filter=M --name-status --no-index ./ path/to/other/dir

另见:https://git-scm.com/docs/git-diff


我真的不明白你想要什么,但对你来说不够diff -ur吗?它甚至可以在没有任何版本控制的目录上工作。


它不是特定于git的,但作为Windows的一般差异实用程序,我真的很喜欢WinMerge。


git diff正是如此。但它只适用于git项目。

hg diffsvn diff漂亮的每个版本控制系统都可以区分目录树