【问题标题】:How can I remove everything from a remote Git repository?如何从远程 Git 存储库中删除所有内容?
【发布时间】:2012-07-17 19:30:40
【问题描述】:

我怎样才能完全就地“重新开始”?

如何彻底清除 Git 远程存储库中的所有内容?我是目前唯一的客户,在我可以让它公开之前,我必须清除所有以前的提交。

不是重复的,因为...

这个问题是关于如何在不删除现有存储库的情况下删除历史记录,包括原始基本提交。我的存储库在 SourceForge 上,唯一的方法是销毁整个项目,这需要您提交项目删除请求,他们并不总是同意(尤其是在我的情况下,我的项目小于 90天,所以他们不会授予它)。

【问题讨论】:

  • @EricSauer 把它擦掉。我不想删除实际的仓库,只删除它的内容。
  • 这可能会有所帮助,但我仍在寻找。 stackoverflow.com/questions/4120502/…
  • 你能清除 repo 并创建一个新的吗?
  • @KeithThompson 我不能 :( 我的存储库在 SourceForge 上,唯一的方法是销毁整个项目,这需要您提交项目删除请求,而他们没有总是授予(特别是在我的情况下,我的项目不到 90 天,他们不会授予它)。:(

标签: git version-control repository


【解决方案1】:

这是一个简单的方法:

  1. 创建一个空的 git 存储库。

    git init

  2. 进行虚拟提交:

    touch README.md git add README.md git commit -m "first commit"

  3. 引用你要覆盖的仓库:

    git remote add origin REMOTE_URL

  4. 覆盖远程 git

    git push --force origin

  5. 移除现有的远程标签(一一)

    git push --delete origin TAG_NAME

【讨论】:

    【解决方案2】:

    使用 git push 命令删除分支

    $git push origin :remotebranch_name

    这将完全删除远程分支

    【讨论】:

      【解决方案3】:

      推送一个(大部分)空分支

      您必须在分支上至少提交一次才能将其推送到远程存储库。如果你根本没有头脑,git 将没有任何东西可以发送到 origin。您可以通过使用空提交创建一个空分支来解决此问题。例如:

      git symbolic-ref HEAD refs/heads/empty_branch
      rm .git/index
      git commit --allow-empty -m 'Initialize empty branch.'
      git branch -M empty_branch master
      git push --force origin
      

      完成后,您当前的 master 和 origin/master 都将包含一个无文件提交。当 git 执行垃圾回收时,存储库中的底层对象最终会被回收。

      删除所有标签

      如果要删除所有本地和远程标签,可以在本地删除标签之前将一组空引用推送到远程。例如:

      # Delete all tags present on the local host from the remote
      # host in one push operation.
      git for-each-ref --format=':%(refname)' --shell refs/tags |
          xargs git push origin
      
      # Delete all local tags.
      git tag -d $(git tag)
      

      【讨论】:

      • 让我建议更改此答案以删除所有分支。这不会强加新历史必须基于特定的初始提交的约束。
      【解决方案4】:

      如果远程名称是 origin 并且您对远程存储库具有强制推送权限,这将删除远程存储库中的 每个分支每个标记

      REMOTE=origin
      
      for i in .git/refs/$REMOTE/origin/*
      do
          git push $REMOTE :"`basename "$i"`"
      done
      
      for i in `git tag`
      do
          git push $REMOTE :refs/tags/$i
      done
      

      这是一项破坏性操作,因此请确保您真的要先执行此操作。

      【讨论】:

      • 他想擦除提交历史——不仅仅是分支。
      • 如果您没有直接访问服务器的权限(例如,GitHub 存储库),这与擦除提交非常接近。在此操作之后,提交将在远程存储库中成为孤立的(将无法访问),并且 对任何客户端都将不可见。当服务器上发生git gc 时,实际的提交对象将在以后被清理。这类似于DELETE SQL 命令通常不会从磁盘中删除数据,而是将记录标记为已删除,随后会出现垃圾收集过程并回收空间。
      • @cdhowie fatal: Invalid refspec ':*' fatal: The remote end hung up unexpectedly
      • @KevinOrr 那么没有origin 遥控器,或者origin 遥控器没有任何分支。先试试git fetch origin
      • @cdhowie $ git fetch origin Password: warning: no common commits remote: Counting objects: 8, done. remote: Compressing objects: 100% (8/8), done. remote: Total 8 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (8/8), done. Unpacking objects: 100% (8/8), done. From ssh://git.code.sf.net/p/hangman4pygame/code ` * [新分支] master -> 3385@445@9876基本名称“$i”"; donePassword:fatal: Invalid refspec ':*'fatal: The remote end hung up unexpectedly
      【解决方案5】:

      ssh 到服务器并在项目目录中执行rm -rf .git。如果您想再次将其放在 git 下,请运行 git init

      【讨论】:

      • OP 无法做到这一点。在此答案之后发布的评论中,他说存储库在 SourceForge 上,他无法删除它。
      猜你喜欢
      • 2015-09-18
      • 1970-01-01
      • 2017-08-15
      • 2011-01-01
      • 2012-11-28
      • 2012-11-28
      • 1970-01-01
      • 2012-08-31
      相关资源
      最近更新 更多