我有一个GIT存储库(涵盖或多或少的项目历史记录)和单独的资源(只是一个很少的文件),这些资源已在一段时间前(实际上是在2004年或2005年的某个地方)。

Tarball的消息来源经历了很多变化,我想纳入一些变化。现在的问题是 - 如何找出更改来源的实际分支点是什么,以最小化那里发生的事情。

因此,我基本上想要的是在GIT历史上找到位置,该代码与我拥有的来源最相似。而且我不想手动这样做。

还值得一提的是,更改的来源仅包含文件的子集,并将某些文件分为更多。但是,那里的代码似乎只会得到一些小的修改和几个添加。

如果您想自己玩那个,带有来源的Tarball是 这里 Git主持 胆怯: git://gitorious.org/gammu/mainline.git

有帮助吗?

解决方案

在一般情况下,您实际上必须检查每个提交,因为您无法知道您是否可能有一个巨大的差异,而下一个差异,然后是另一个巨大的差异,然后是媒介差异...

最好的选择可能是将自己限制在特定文件上。如果您仅考虑一个文件,则不应花很长时间遍历该文件的所有版本(使用 git rev-list <path> 要获取列表,因此您不必测试每个提交)。对于修改文件的每个提交,您可以检查差异的大小,并很快找到最小值。为了少量文件,希望他们能同意!

为差异设置自己的最佳方法是通过简单地复制tarball来做出临时提交,以便您可以拥有一个名为的分支机构 tarball 比较。这样,您可以做到这一点:

git rev-list path/to/file | while read hash; do echo -n "$hash "; git diff --numstat tarball $hash path/to/file; done

为了获得所有使用差异大小的提交的列表(前三列将是SHA1,添加的行数以及已删除的行数)。然后,您可以将其插入 awk '{print $1,$2+$3}' | sort -n -k 2, ,您将有一个分类的提交列表及其差异!

如果您不能将自己限制在少量的文件中进行测试,我可能会很想手工实施类似的东西 git-bisect - 只要尝试将自己的方式缩小到一个小的差异,就可以假设最有可能在最佳情况下提交也会有较小的差异,并且远离它的差异将具有较大的差异。 (可能在牛顿的方法和完整的二进制/网格搜索之间?)

编辑:建议的另一种可能性 道格拉斯的回答, ,如果您认为某些文件可能是 完全相同的 对于某些承诺的人来说,就是要使用 git-hash-object, ,然后看看您的历史上有什么斑点。有个 问题有一些出色的答案 关于如何做到这一点。如果您使用少数文件(最好是经常更改的文件)执行此操作,则可以很快地缩小目标提交的范围。

其他提示

这不是一个很好的解决方案,而是要猜测它可能是哪些修订:假设焦油球中的某些文件自分支以来没有更改。跑 git哈希对象 与焦油球中的每个文件相对,然后使用 Git Show. 。然后尝试找到包含这些文件的提交,可能会使用 git变了. 。然后,您的问题的答案可能是最常见的文件提交的内容,但仍然有些打击和错过。

根据Araqnid所说的话,我想出了9c6c86426bf88429e7777e22b5aa78e9295b97a(只要求在0.61.0和头之间找到东西),这可能不是最好的东西),您可能会做得更好)

git rev-list --no-merges --all | while read rev; do patchsize=$(git diff $rev | wc -c); echo $patchsize $rev; done | sort -n | less

假设您已经将Tarball导入到Git并进行了检查(我通过拒绝,然后做到这一点

git init
git add .
git commit -m "import tarball"
git remote add origin git://gitorious.org/gammu/mainline.git

因此,在您执行此操作后,以上运行应以patchsize的上升顺序输出所有差异的大小(第一个是0,因为它会找到当前的头部),这将花费很长时间...但是它应该找到最小的差异...

叉是如何制成的?是别人制作的克隆,然后做自己的工作吗?如果是这样,那么这真的很容易。您需要做的就是创建一个本地分支,该分支从叉子中拉出代码。吉特(Git)将看到分叉分支的血统指向您原始存储库中的一个提交,并将“连接点”“连接点”……它将重新连接从您的原始存储库到叉子的历史记录。

您应该能够做到这一点:

git remote add thefork git://wherever.it.lives/thefork.git

git fetch thefork

git branch -f thefork-branch thefork/branchname

git checkout thefork-branch

此时,您可以运行 gitk 并查看分叉分支机构和您的本地存储库的完整历史记录,看看它们是否连接。

将这些文件在tarball中导入到git修订中,在单独的分支或全新的分支上:修订图中的位置并不重要,我们只希望它作为树可用。

现在,对于Master中的每个修订版,只需与该树/修订版(“导入”)相反,然后输出差异有多大。就像是:

git rev-list master | while read rev; do patchsize=$(git diff $rev imported | wc -c); echo $rev $patchsize; done

因此,根据非常粗略的经验法则,最小的贴片大小的修订将是“最接近的”。 (相同的修订将产生一个贴剂大小为0,其他任何东西肯定不会为零,而变化越多,越大)。

如果您对叉子发生的位置有一个粗略的想法,请考虑使用Will Manley的 git meld. 。 (也可以看看: 查看与融合的分支机构的差异?.)

为此,请将Tarball内容添加到您的存储库中(无论如何您将要做)。安装熔体后 git-meld, , 跑

git meld branch_from_tarball commit_to_check &

在不同的提交中,直到找到差异最小的一个。此命令将打开 meld 并查看指定提交之间目录树的更改,并隐藏了相同的文件。示例屏幕截图:

融合显示两个截然不同的提交:
Very different

显示两个类似的提交:Similar

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top