git svn fetch error: 182135 = 1234abcdef already exists! Why are we refetching it?

栏目: 编程工具 · 发布时间: 5年前

内容简介:我有一个SVN仓库和Git-SVN仓库,两者进行同步。SVN仓库里面有几个提交时间戳不正确,同步到Git-SVN仓库后,时间戳也是不正确的。我手动修复了SVN仓库里的提交时间戳,然后如何修复Git-SVN仓库里的提交时间戳?提交时间戳错误可能是微不足道的,但它会影响Git时间搜索功能。例如,在TortoiseGit里搜索1/1/2018到9/14/2018的提交,TortoiseGit就不会显示63a958bd之前的提交。因为Git发现63a958bd的时间戳突然变成1969年,便认为之后的提交都是不感兴

症状

我有一个SVN仓库和Git-SVN仓库,两者进行同步。SVN仓库里面有几个提交时间戳不正确,同步到Git-SVN仓库后,时间戳也是不正确的。我手动修复了SVN仓库里的提交时间戳,然后如何修复Git-SVN仓库里的提交时间戳?

git svn fetch error: 182135 = 1234abcdef already exists! Why are we refetching it?

问题

提交时间戳错误可能是微不足道的,但它会影响Git时间搜索功能。例如,在TortoiseGit里搜索1/1/2018到9/14/2018的提交,TortoiseGit就不会显示63a958bd之前的提交。因为Git发现63a958bd的时间戳突然变成1969年,便认为之后的提交都是不感兴趣的,作为优化,便不再继续搜索了。

解决方法

运行 git svn reset -p 182135 ,182135是最早的要修复的提交,所以把git-svn设置成182135的 p arent,即182134。然后运行 git svn fetch

按道理应该能正确运行,但是上述命令却提示错误

gqqnbig MINGW64 /c/LoansPQ2-Git-SVN (master)
$ git svn reset 182134
r182134 = c6a305c34c3aef88f086f9b00c91dfd840f9e573 (refs/remotes/git-svn)

gqqnbig MINGW64 /c/LoansPQ2-Git-SVN (master)
$ git svn fetch
Index mismatch: 5570880225692ca3ab9ff3d9d2b2859e37653249 != d10fc78290e99d8e263a647787c6826c39866125
rereading c6a305c34c3aef88f086f9b00c91dfd840f9e573
182135 = 4261a2eb954c1a2907dc2ec4c4691e0a417ad729 already exists! Why are we refetching it?
at C:/Program Files/Git/mingw64/share/perl5/Git/SVN/Ra.pm line 476.

尝试解决

具体错误原因我不是很了解,我一开始以为因为存在4261a2eb这个提交,但发现实际上不存在。我猜可能需要垃圾回收,运行了 git gcgit svn gc 都没用。

我尝试设置 svn.ignore-path 忽略r182135修改的文件,制造一个SHA1不同的提交,但也没用。

成功解决

我研究一下Git源代码看看到底是怎么回事。”Why are we refetching it?”存在于C:\Program Files\Git\mingw64\share\perl5\Git\SVN.pm,

sub do_git_commit {
	my ($self, $log_entry) = @_;
	my $lr = $self->last_rev;
	if (defined $lr && $lr >= $log_entry->{revision}) {
		die "Last fetched revision of ", $self->refname,
		    " was r$lr, but we are about to fetch: ",
		    "r$log_entry->{revision}!\n";
	}
	if (my $c = $self->rev_map_get($log_entry->{revision})) {
		croak "$log_entry->{revision} = $c already exists! ",
		      "Why are we refetching it?\n";
	}
	my $old_env = set_commit_header_env($log_entry);
	my $tree = $log_entry->{tree};
	if (!defined $tree) {
		$tree = $self->tmp_index_do(sub {
		                            command_oneline('write-tree') });
	}
	......
}

我把抛出错误的那几行注释掉,再运行git svn fetch,就可以成功获取提交了。然后,记得把文件改回来。

反思

我的这个方法可以算是奇技淫巧,问题的本质应该是git-svn在检查重复对象时没有考虑时间戳。正确的方法应该要考虑时间戳,再计算SHA1。鉴于Git是开源项目,应该有空修改一下并发起一个拉取请求。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

互联网思维独孤九剑

互联网思维独孤九剑

赵大伟 / 机械工业出版社 / 2014-3-20 / 49

《互联网思维独孤九剑》是国内第一部系统阐述互联网思维的著作,用9大互联网思维:用户思维、简约思维、极致思维、迭代思维、流量思维、社会化思维、大数据思维、平台思维、跨界思维,以专业的视角全方位解读移动互联网给传统产业带来的变革,涉及战略规划、商业模式设计、品牌建设、产品研发、营销推广、组织转型、文化变革等企业经营价值链条的各个方面。这是一部传统企业互联网转型必读的“孙子兵法”,帮助我们开启对新商业文......一起来看看 《互联网思维独孤九剑》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

html转js在线工具
html转js在线工具

html转js在线工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换