git-p4克隆repo包含混合文件名的情况 - 如何修复?

时间:2010-10-27 19:51:12

标签: windows perforce case-insensitive msysgit git-p4

我使用git-p4导入了一个大型仓库,发现我有一些奇怪的混合大小写文件名,例如:

dirA/DIRb/file1.txt

然后是其他文件:

DIRa/dirB/FILE2.txt

等等。这些以这种方式进入回购,因为git-p4使用快速导入。这导致Git神秘地声称存在未跟踪的目录,这些目录绝对不是未跟踪的,并且没有新文件。我从阅读这个问题中发现:

git still untracked after add

并且特别是slayerIQ的回答,这可以通过重命名有关的dirs来修复以获得匹配的大小写。事实上,在一些文件只有一种案例格式的情况下,这就解决了这个问题。但对于像我上面提到的混合的那些,它什么也没做。这种上市证实了我对此案的怀疑:

git ls-tree --name-only -r branch

我考虑使用历史重写来尝试修复它,但这看起来非常重量级,除非我必须(我的树是〜25K文件),否则我有点犹豫不决。另一方面,我在一棵干净的树上做“git status”并获得一个大约35个“未跟踪”路径的列表。所以这有点站不住脚。

如果需要,我可以从头开始执行git-p4克隆,但我怀疑混合大小写路径来自Perforce本身。 SmartGit没有树的这个问题,并且将确切的树复制到新的repo工作正常(因为它已正确添加)。

关于如何进行的任何想法?

谢谢:)

1 个答案:

答案 0 :(得分:0)

我继续尝试git filter-branch --tree-filter "" HEAD但是没有做任何事情。也许有一种更漂亮的方式来做到这一点,我错过了。 (我的git-fu很弱。)

这是丑陋,丑陋,丑陋,但我发现至少有一种方法可以做到:

  • git-p4 rebase让所有内容都保持最新状态。

  • .git复制到另一个目录。

  • 切换到该新目录并使用git reset --hard更新树。

  • 删除您刚刚复制的闪亮.git。现在有一张原始树,最新的Perforce办理登机手续。

  • git initgit add -A,然后git commit,在新树上进行初始签到。对于提交消息,请模仿git-p4的初始登记消息:

Initial import of //depot/ from the state at revision #head

[git-p4: depot-paths = "//depot/": change = 58840]

  • 当然,将58840更新为之前最后修订版的内容,以及适合您的软件仓库路径。 (查看另一棵树中的提交日志将告诉您需要知道的所有内容。)

  • git gc之后如果您不希望事情变得非常缓慢。

您现在应该拥有一个基本的非git-p4树。我们还需要设置远程参考。我确信有一种巧妙的方法,但我不知道,所以我会告诉你我做了什么。

  • git log找到我们的导入修订版。请注意其SHA ID。

  • 查看原始repo的.git/refs树。将.git/refs/remotes复制到<newrepo>/.git/refs。编辑refs/remotes/p4/master以反映您的HEAD的SHA ID。

你现在应该拥有一个功能齐全的仓库,它看起来像git-p4,就像它自己检查一样,但是具有一致的套管。当然,你失去了以前的当地历史:(但如果你早点这样做,那就没那么大了。

如果git-p4继续使用快速导入,我不确定问题是否会随着时间的推移而重新出现,但是当我的树在干净的时候显示为干净的git status