在hg或git中的两个完整目录/项目之间进行区分?

med*_*iev 50 git cvs version-control diff mercurial

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

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

use*_*ca8 80

为了简单地创建一个diff补丁从任意两个文件或目录,Git的差异格式,没有任何花哨的东西,仓库或版本控制:

git diff --no-index some/path other/path >> some_filename
Run Code Online (Sandbox Code Playgroud)

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

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


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

git diff --no-index a b >> patch
Run Code Online (Sandbox Code Playgroud)


Jak*_*ski 22

git diff联机帮助页:

git diff [--options] [--] [<path>...]

[...]
如果给出了两条路径,并且至少有一条未跟踪,则比较两个文件/目录.这种行为可以强制执行--no-index.


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

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

$ GIT_ALTERNATE_OBJECT_DIRECTORIES=/path/to/repo/.git/objects \
   git diff $(git --git-dir=/path/to/repo/.git rev-parse --verify A) B
Run Code Online (Sandbox Code Playgroud)

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

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

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


Sha*_*tin 10

是否有某种实用的hg/git我可以做树差异... [s] o说,新添加的文件,删除的文件之间有一个标记 ... [强调添加]

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

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

git diff --name-status --no-index ./ path/to/other/dir
Run Code Online (Sandbox Code Playgroud)

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

git diff --diff-filter=A --name-status --no-index ./ path/to/other/dir
Run Code Online (Sandbox Code Playgroud)

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

git diff --diff-filter=D --name-status --no-index ./ path/to/other/dir
Run Code Online (Sandbox Code Playgroud)

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

git diff --diff-filter=M --name-status --no-index ./ path/to/other/dir
Run Code Online (Sandbox Code Playgroud)

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


And*_*est 8

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


Thi*_*ais 8

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


kni*_*ttl 5

git diff正是这样做的。但它只适用于 git 项目。

hg diffsvn diff几乎每个版本控制系统都可以比较目录树

  • 实际上 `git diff` **可以**比较任意文件/目录;您可能需要使用其“--no-index”选项 (34认同)
  • 你能详细说明我如何使用“git diff”吗?我创建了两个单独的 git 项目,现在如何比较它们?我对 VCSing 还比较陌生。 (3认同)