【问题标题】:Removing '.git' directory from git repo?从 git repo 中删除“.git”目录?
【发布时间】:2013-05-25 04:06:58
【问题描述】:

我正在尝试将 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'

Commit a9ee490ac00987835de30bdbc851da5e8d45d28b 包含以下文件:

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

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

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

pushing a git repo fails with error: contains '.git' 中的答案无济于事,因为我将回购作为 git 回购,而不是一个反复无常的回购。

我试过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知识有限。有人可以帮忙吗?

【问题讨论】:

  • repo 是开源的吗?你能分享一份吗?
  • 啊,不需要共享有问题的 repo 的副本,我已经设法用相同类型的坏树构建了一个 Git 存储库,我可以将其用于测试目的。
  • 谢谢@dana!我现在正面临 exact 同样的问题(之前错误添加了 .git 文件夹,而 repo 仍在 hg 中)

标签: git mercurial git-filter-branch git-rewrite-history


【解决方案1】:

你试过下面的命令吗?

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

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

【讨论】:

  • 不幸的是,我认为这种方法行不通——针对我构建的测试存储库运行,这是我得到的输出: $ git filter-branch --tree-filter 'rm -Rf foo/.git' HEAD ..... Rewrite 6652877677cf01a7b668704134d5e8bb62bfe317 (6/6)error: Invalid path 'foo/.git/folder/zero' error: Invalid path 'foo/.git/hero' error: Invalid path 'foo /.git/zero' 忽略路径 foo/.git/folder/zero 忽略路径 foo/.git/hero 忽略路径 foo/.git/zero 警告:参考 'refs/heads/master' 不变
  • ...所以看起来即使使用 'git filter-branch --tree-filter' 也有@dana 在问题中遇到的问题。我认为此时使用 The BFG 可能是一个更好的主意。
【解决方案2】:

据我了解,现在 kiln 将允许您将存储库克隆为 git 或 Mercurial,因此将其克隆为 mercurial,使用 mercurial filemap solution you already found 将 Mercurial 回购 作为新回购 推送到 Kiln然后将其克隆为 git。然后你会有一个可以推送到 github 的 git repo。

【讨论】:

    【解决方案3】:

    使用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 文件夹的特殊构造的test repo 进行了测试,它工作得很好。

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

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

    【讨论】:

    • 我遇到了同样的问题,这个解决方案为我解决了问题。
    • 谢谢!!我也遇到了同样的问题,这救了我的命。如果可以,我会将其标记为正确答案。
    • 我尝试了 git filter-branch 方法,但它不起作用,但使用 bfg repo-cleaner 就像一个魅力。谢谢!
    • 第一次也为我工作 - 感谢 Roberto 的出色工具!
    • 这对我有用。非常感谢。 BFG 工具完成了这项工作。
    【解决方案4】:

    处理 Mercurial (Hg) 存储库中嵌入了 .git 文件夹的情况的另一种方法是在导出到 Git 之前先“修复”Hg 存储库。 @laurens-holsta great way of doing this

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

    exclude ".git"
    

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

    [extensions]
    convert =
    

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

    hg convert --filemap my-filemap originalrepo newrepo
    

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

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

    【讨论】:

      【解决方案5】:

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

      简单快捷:

      git filter-repo --force --invert-paths --path-glob '*/.git' --path '.git'
      

      【讨论】:

      • 工作就像一个魅力。谢谢!对我来说,一个 18 GB 的存储库只需要 4.5 分钟。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 2014-04-15
      相关资源
      最近更新 更多