hg 或 git 中两个完整目录/项目之间的差异?

问题描述 投票:0回答:9

我继承了一个最初存储在 CVS 中的项目以及所有修订。我做了相当多的编辑,并且我正在尝试比较我在原始目录中所做的所有更改,关于添加的新文件与旧文件。

hg/git 是否有某种实用程序可以让我进行树差异或类似性质的操作?这样说来,新增文件、删除文件之间都有一个标记,我的要求是不是太高了?

git version-control diff cvs mercurial
9个回答
146
投票

简单地从两个任意文件或目录以 git 的 diff 格式创建一个 diff 补丁无需任何花哨的存储库内容或版本控制

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

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

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


为了方便复制和粘贴,如果您已经

cd
到包含名为
a
的原始目录/文件和修改后的目录
b
的目录,则它将是:

git diff --no-index a b > patch

26
投票

来自

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

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

说明:

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

替代解决方案是简单地使用git remote add(和

git fetch
)将其他存储库导入到给定存储库中。 然后您将在本地拥有所有内容,并且能够在单个存储库中进行比较。
    


18
投票
是否有某种适用于 hg/git 的实用程序,我可以在其中进行树差异...[s]o 也就是说,
新添加的文件、删除的文件之间有一个标记

...[强调已添加]

是的。我们可以
git diff

将当前目录与另一个目录进行比较,然后...


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

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

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

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

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

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

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

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

另请参阅:
https://git-scm.com/docs/git-diff


11
投票
WinMerge


8
投票
diff -ur

对你来说还不够吗?即使在没有任何版本控制的目录上它也可以工作。

    


5
投票
git diff

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


hg diff

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


1
投票

    Git 中有语法:
  1. 语法:git-diff [] [--] [...] 这个表单是查看你相对于索引(下一次提交的暂存区)所做的更改。换句话说,差异就是您可以告诉 Git 进一步添加到索引中但您仍然没有添加的内容。

这是。 网址:

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

git diff --no-index 目录 1 项目/路径 目录 2 项目/路径 >> 文件名

    使用
  1. Linux 命令

    diff --brief --recursive dir1path/ dir2Path/

  2. 如果您使用的是 Windows,则有一个应用程序
  3. WinMerge


0
投票
--binary

仅适用于二进制文件):

git diff --no-prefix --no-index --binary dir1 dir2 > dir.diff

将补丁应用于工作目录的内容,其内容与 dir1 相同:

cd dir1_copy git apply ../dir.diff

git apply

有默认值

-p1
,它会删除 diff 命令中的前导目录。
    


0
投票
diff

命令:

diff dir1 dir2

输出到文件:

diff dir1 dir2 > diffs.txt

	
© www.soinside.com 2019 - 2024. All rights reserved.