0

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

dirA/DIRb/file1.txt

然后像这样的其他文件:

DIRa/dirB/FILE2.txt

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

添加后git仍然未跟踪

特别是 slayerIQ 的回答,这可以通过重命名有问题的目录以具有匹配的情况来解决。事实上,在一些文件只有一个案例格式的情况下,这修复了它。但对于我上面提到的那些混杂的,它什么也没做。这种列表证实了我对这个案子的怀疑:

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

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

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

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

谢谢 :)

4

1 回答 1

0

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

这很丑,丑,丑,但我至少找到了一种方法:

  • git-p4 rebase让一切都保持最新。

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

  • 切换到该新目录并使用git reset --hard.

  • 删除.git你刚刚复制过来的那个闪亮的。现在有一个带有最新 Perforce 签入的原始树。

  • git init然后git add -Agit 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 方法可以做到这一点,但我不知道,所以我会告诉你我做了什么。

  • git log找到我们的导入修订。记下它的 SHA ID。

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

你现在应该有一个功能齐全的 repo,它看起来像 git-p4 一样,它自己检查了它,但具有一致的大小写。当然,您丢失了以前的本地历史 :( 但如果您尽早这样做,那没什么大不了的。

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

于 2010-11-02T20:22:40.587 回答