EGit not-for-merge

时间:2013-08-15 22:04:32

标签: eclipse egit

我克隆了我在Github的新回购和工作目录中的FETCH_HEAD文件 - > .git包含以下内容:

fe300b2c9852acf68b4f1dd78ace916a083f3236    not-for-merge   branch 'master' of ssh://git@github.com/mike123/myRepo.git

不合并是什么意思?

2 个答案:

答案 0 :(得分:0)

基本上,git fetch获取分支并将结果存储在FETCH_HEAD文件中。当它作为git pull的一部分运行时,此信息稍后在内部用于决定需要合并的内容。

如果获取了多个分支,则稍后仅合并未标记为not-for-merge的分支。另请参阅this blog post by Junio

在您的情况下,JGit(EGit用于处理Git存储库的库)似乎与命令行Git实现的行为不同。在命令行Git中,克隆后没有FETCH_HEAD。但是在你第一次拉动之后,文件就在那里。尝试拉动并查看文件的更改方式。实施中的这种差异应该没有任何危害。

答案 1 :(得分:0)

Egit基于JGit,“not-for-merge”仅用于org.eclipse.jgit.transport.FetchHeadRecord

FetchHeadRecord的notForMerge变量在org.eclipse.jgit.transport.FetchProcess#want方法中设置。

    fhr.notForMerge = spec.getDestination() != null;

如果refspec目标不为null,则此提取的HEAD不用于合并。

当您获取远程分支时,远程分支的目标是refs/remotes/yourRemote,因为fetch refspec的本地配置:

[remote "origin"]
   fetch +refs/heads/*:refs/remotes/origin/*

在没有直接目的地的情况下获取的一个分支将是跟踪远程分支的分支:

[branch "master"]
        remote = origin
        merge = refs/heads/master

这就是为什么在获取JGit repo之后(在命令行中,而不是在Eclipse Egit中),我看到了:

C:\Users\VonC\prog\git\jgit\.git>type FETCH_HEAD
c2a9f9e742f7e6633af130823c154a485e6071b2                branch 'master' of https://github.com/eclipse/jgit
51d1af9489924ff03fa10ec963110c608c2882a3        not-for-merge   branch 'stable-0.10' of https://github.com/eclipse/jgit
989149736ad1cd09c15e143aa598028b9f9b6502        not-for-merge   branch 'stable-0.11' of https://github.com/eclipse/jgit
b2b58feba7400269df8b31ef8495b695af3a9793        not-for-merge   branch 'stable-0.12' of https://github.com/eclipse/jgit

让我们尝试在Egit / JGit(Luna,Egit 3.0,Win7 64位)中重现:

在多次提取后,我从未看到没有 a not-for-merge的条目。
即使从一个远程分支合并新命令的拉动仍然会产生FETCH_HEAD

220c4502ecea147ef4beaae8039b168965e148e9    not-for-merge   branch 'master' of ..\..\jgit

我猜JGit的行为在这方面有所不同。