3

我使用 hg-fast-export 工具将一些 mercurial repos 转换为 git,虽然它们都转换得很好,但当我推送 repo 时出现以下错误。

$ 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'

“包含'.git'”错误具有非常广泛的术语并且找不到任何文档,所以我尝试在原始存储库中搜索现有的'.git'文件夹并且我做到了。有一个 subsubsub-folder 包含我用 git rm 删除的旧 git 存储库的实例,但是问题仍然存在。

无论如何我可以将它推送到 github 或者一个新的干净的 repo 是唯一的选择吗?

对此的任何帮助表示赞赏。谢谢!

4

2 回答 2

5

您可以使用带有文件映射的命令convert从存储库中剥离 git 存储库。之后它将从历史记录中消失,并且存储库可以安全地导入到 git。

例子:

$ echo "exclude path/to/.git" > my-filemap
$ hg convert --filemap my-filemap originalrepo newrepo

请注意,这convert是一个捆绑的扩展,您首先需要.hgrc像这样启用它:

[extensions]
convert =

有关详细信息,请参阅hg help convert

于 2013-02-06T15:15:53.223 回答
0

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

但是,另一种方法可能是重新设置一些变更集。提供您想要推送的内容在.git添加无关内容之前具有变更集,并且您不介意丢失一点历史细节,您可以将它们重新设置为一个变更集并尝试推送它。理论上(!!)该.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 将该变更集压缩到其父项中。我基本上将所有变更集压缩为一个。它似乎对我有用,其余的变更集都没有删除的文件。这是否允许你推动,我不知道。

当然,先在克隆或其他东西上试试这个。

于 2013-02-06T14:09:20.457 回答