我使用git-p4导入了一个大型仓库,发现我有一些奇怪的混合大小写文件名,例如:
dirA/DIRb/file1.txt
然后是其他文件:
DIRa/dirB/FILE2.txt
等等。这些以这种方式进入回购,因为git-p4使用快速导入。这导致Git神秘地声称存在未跟踪的目录,这些目录绝对不是未跟踪的,并且没有新文件。我从阅读这个问题中发现:
并且特别是slayerIQ的回答,这可以通过重命名有关的dirs来修复以获得匹配的大小写。事实上,在一些文件只有一种案例格式的情况下,这就解决了这个问题。但对于像我上面提到的混合的那些,它什么也没做。这种上市证实了我对此案的怀疑:
git ls-tree --name-only -r branch
我考虑使用历史重写来尝试修复它,但这看起来非常重量级,除非我必须(我的树是〜25K文件),否则我有点犹豫不决。另一方面,我在一棵干净的树上做“git status”并获得一个大约35个“未跟踪”路径的列表。所以这有点站不住脚。
如果需要,我可以从头开始执行git-p4克隆,但我怀疑混合大小写路径来自Perforce本身。 SmartGit没有树的这个问题,并且将确切的树复制到新的repo工作正常(因为它已正确添加)。
关于如何进行的任何想法?
谢谢:)
答案 0 :(得分:0)
我继续尝试git filter-branch --tree-filter "" HEAD
但是没有做任何事情。也许有一种更漂亮的方式来做到这一点,我错过了。 (我的git-fu很弱。)
这是丑陋,丑陋,丑陋,但我发现至少有一种方法可以做到:
git-p4 rebase
让所有内容都保持最新状态。
将.git
复制到另一个目录。
切换到该新目录并使用git reset --hard
更新树。
删除您刚刚复制的闪亮.git
。现在有一张原始树,最新的Perforce办理登机手续。
git init
和git 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
。