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

时间:2009-11-24 18:03:31

标签: git version-control diff cvs mercurial

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

hg / git有哪些实用工具,我可以做树差异,还是那种性质的东西?那么说,新添加的文件,删除的文件之间有标记,我要求的太多了吗?

8 个答案:

答案 0 :(得分:72)

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

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

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

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


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

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

答案 1 :(得分:22)

来自git diff manpage

  

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)将导入其他存储库简单地导入到给定的存储库中。然后你就可以在本地获得所有东西,并且能够在单个存储库中进行比较。

答案 2 :(得分:9)

  

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

答案 3 :(得分:7)

这不是特定于git的,但作为Windows的一般差异实用工具,我非常喜欢WinMerge

答案 4 :(得分:7)

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

答案 5 :(得分:3)

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

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

答案 6 :(得分:1)

还有两种方法可以在两个目录/项目之间进行区分。

  1. 在Git中有语法:

语法: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,则有一个应用程序 WinMerge

答案 7 :(得分:0)

创建从dir1到dir2的补丁程序(--binary仅用于二进制文件):

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

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

cd dir1_copy
git apply ../dir.diff

git apply具有默认的-p1,它会删除diff命令中的前导目录。

相关问题