27

我正在尝试将 git repo 从 Kiln 迁移到 Github。我可以很好地添加新的遥控器,但是当我尝试将 master 推送到新的遥控器时,我收到以下错误:

Counting objects: 8691, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3000/3000), done.
remote: error: object a9ee490ac00987835de30bdbc851da5e8d45d28b:contains '.git'
remote: fatal: Error in object
error: pack-objects died of signal 13
error: failed to push some refs to 'git@github.com:Account/repo.git'

Commita9ee490ac00987835de30bdbc851da5e8d45d28b中包含以下文件:

.git/
CHANGELOG.md
JSONKit.h
JSONKit.m
README.md

显然,过去有人使用hg, 在子目录中签入了完整的 git 存储库。

我想完全杀死该目录,但在从 git 历史记录中删除该文件时遇到了麻烦。

推送 git repo的答案因错误而失败: contains '.git'没有帮助,因为我将 repo 作为 git repo,而不是一个 mercurial 的。

我试过git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch .git'了,但我得到了错误:

Rewrite 7dbd0970d6c79215d11994b4a9b8091b2e954cfb (326/442)error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/HEAD'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/config'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/description'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/hooks/applypatch-msg.sample'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/hooks/commit-msg.sample'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/hooks/post-update.sample'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/hooks/pre-applypatch.sample'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/hooks/pre-commit.sample'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/hooks/pre-rebase.sample'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/hooks/prepare-commit-msg.sample'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/hooks/update.sample'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/index'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/info/exclude'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/logs/HEAD'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/logs/refs/heads/master'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/objects/pack/pack-43fac03d375df5c1e380c5e522ba6bcb9b4e1ec1.idx'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/objects/pack/pack-43fac03d375df5c1e380c5e522ba6bcb9b4e1ec1.pack'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/packed-refs'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/refs/heads/master'
error: Invalid path 'Account/Libraries/ShareKit/Submodules/JSONKit/.git/refs/remotes/origin/HEAD'

历史似乎没有改变。我的git知识有限。任何人都可以帮忙吗?

4

5 回答 5

39

使用BFG Repo-Cleaner,这是一种更简单、更快的替代方案,git-filter-branch专门用于从 Git 历史记录中删除文件。

仔细按照此处的步骤操作:https ://rtyley.github.io/bfg-repo-cleaner/#usage - 但核心位是这样的:下载BFG jar(需要 Java 8 或更高版本)并运行以下命令:

$ java -jar bfg.jar --delete-folders .git --delete-files .git --no-blob-protection my-repo.git

将扫描您的整个存储库历史记录,并.git删除任何命名的文件或文件夹。我已经针对包含文件夹的特殊构建的测试存储库.git对此进行了测试,并且效果很好。

感谢 Michel Jouvin提醒我名为 '.git'的文件在 Git 中也是非法的(并且 Git 报告的错误消息并没有立即表明它们文件,而不是文件夹),我已经更新了这个答案反映这一点。

全面披露:我是 BFG Repo-Cleaner 的作者。

于 2013-05-30T17:33:14.473 回答
2

从 git 2.2.22 开始,执行此操作的方法是使用git-filter-repo工具。

简单快捷:

git filter-repo --force --invert-paths --path-glob '*/.git' --path '.git'
于 2020-05-22T12:16:19.247 回答
1

您是否尝试过以下命令?

git filter-branch --tree-filter 'rm -Rf .git' HEAD

git filter-branch 文档表明这会比 慢--index-filter,但它可以完成这项工作。

于 2013-05-29T21:23:35.743 回答
1

处理 Mercurial (Hg) 存储库中嵌入了 .git 文件夹的情况的另一种方法是在导出到 Git 之前首先“修复”汞存储库。@laurens-holst一个很好的方法来做到这一点

如果 .git 文件夹位于项目的根目录中,则创建一个文本文件,my-filemap如下所示:

exclude ".git"

在 .hgrc 文件中启用转换扩展:

[extensions]
convert =

然后使用 Hg convert 扩展名过滤掉 .git 文件夹:

hg convert --filemap my-filemap originalrepo newrepo

现在您可以从 newrepo 导出,并且不会遇到嵌入式 .git 文件夹的问题。

您还可以git fsck在推送之前确保新的 Git 存储库正常。

于 2018-09-13T12:38:57.760 回答
0

据我了解,kiln 现在可以让您将存储库克隆为 git 或 Mercurial,因此将其克隆为 mercurial,使用您已经找到的 mercurial 文件映射解决方案将 Mercurial 存储库作为新存储库推送到 Kiln,然后将其克隆为 git . 然后你会有一个 git repo,你可以推送到 github。

于 2013-05-30T02:03:34.377 回答