推送Git仓库时出现错误:包含“.git”。

3

我使用hg-fast-export工具将几个Mercurial仓库转换为Git,虽然它们都成功地转换了,但其中一个在我推送仓库时产生了以下错误。

$ git remote add origin git@github.com:asdf/zxcv.git
$ git push -u origin master
Counting objects: 7840, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2817/2817), done.
error: object 324f9ca2aaae7b1d716db3fc31c02d391c1c2c16:contains '.git'
fatal: Error in object
error: pack-objects died of signal 13
error: failed to push some refs to 'git@github.com:asdf/zxcv.git'

"contains '.git'" 错误的范围非常广泛,找不到任何文档,因此我尝试在原始仓库中搜索现有的“.git”文件夹,并且找到了一个子子子文件夹,其中包含旧的git存储库的实例,我使用git rm删除了它,但问题仍然存在。
是否有任何方式可以将其推送到github或者只能选择新的干净仓库?
感谢您的任何帮助。
2个回答

5
您可以使用convert命令与filemap一起从存储库中删除git repo。之后,它将从历史记录中消失,并且存储库将安全导入git。
例如:
$ echo "exclude path/to/.git" > my-filemap
$ hg convert --filemap my-filemap originalrepo newrepo

请注意,convert是一个捆绑的扩展程序,您需要首先在您的.hgrc中启用它,方法如下:
[extensions]
convert =

了解更多信息,请参阅hg help convert


0

您要尝试推送的更改集在其历史记录中包含.git,即使不在最新的更改集中,因此我认为您需要创建一个干净的存储库。

然而,另一种选择可能是重新定义一些更改集。如果您要推送的内容包含在添加冗余.git之前的更改集,并且您不介意失去一些历史细节,您可以将它们 rebase 成一个更改集,然后尝试推送。理论上(!).git目录将被有效地“编辑出”历史记录。

以下是一个示例(注意,我没有像使用Mercurial那样经常使用git,因此不知道这是否有效或我的命令是否有效,但它可以为您提供一个起点):

$ git log --oneline  
1234567 More changes
abcdefa made changes
a5b6482 Added .git sub-sub-sub-directory to repo!
dead123 More things

$ git rm sub-sub-sub/.git
$ git commit -m "Removed .git sub-sub-sub-directory"
$ git log --oneline  
beef456 Removed .git sub-sub-sub-directory
1234567 More changes
abcdefa made changes
a5b6482 Added .git sub-sub-sub-directory to repo!
dead123 More things

$ git rebase -i HEAD~4
... at this point you need to interactively specify what to do*
$ git log --oneline  
eeee987 Some new commit message that sums up the changes
dead123 More things

当我尝试这个操作时,要“压缩”(squash)的变更集列表出现在编辑器中,这与我看过的所有教程都不同——我猜是由于添加和删除文件的冲突。我修改了四个变更集中三个的命令,将其改为“压缩”而不是“挑选”(pick),这指示rebase-merge将该变更集压缩到其父级中。我基本上将所有变更集压缩成了一个。对我来说似乎已经起作用了,剩下的变更集中没有被删除的文件。至于这是否允许您推送或不允许,我不知道。

当然,首先在克隆或其他地方尝试此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接