【问题标题】:Is it possible to completely empty a remote Git repository?是否可以完全清空远程 Git 存储库?
【发布时间】:2011-02-07 13:58:19
【问题描述】:

假设我在第一次推送到远程 Git 存储库时出错。我可以以某种方式恢复它以便存储库恢复到初始状态吗?我无权访问远程机器,因此无法删除 .git 目录。

据我所知,问题是您无法“取消设置”头部。

这就是我(或者实际上是问这个问题的同事)所做的(我在这里做了一个本地“远程”回购,所以任何人都可以测试这个):

mkdir git-remote
cd git-remote
git init --bare
cd ..
mkdir git-local
cd git-local
git clone ../git-remote .
touch a
git add a
git commit -m "initial"
git push origin master

此时他意识到他将错误的内容推送到远程存储库。

我唯一的想法是从他的 repo && git rm && git push 中删除所有内容,这仍然会将错误的提交留在那里,但文件不会打扰第二次推送。

【问题讨论】:

标签: git


【解决方案1】:

我认为您可能遇到了 XY 问题。您实际上不需要将远程存储库恢复到其原始状态即可重新开始;您只需要在本地重新开始,然后将其强制推送到远程。

# create a new repository that has the initial commit that you want
mkdir foo; cd foo; git init; ...; git commit

# set up a remote
git remote add origin <url-of-remote>
git branch --set-upstream master origin/master

# push your new history
git push -f

# delete obsolete remote branches
git push origin :deprecated-branch

远程存储库永远不会返回到无提交状态,但它会在你想要的地方结束,这才是最重要的!

(实际上,旧的提交实际上仍在远程存储库中,但它们处于悬空状态,没有指向它们的引用。当git gc --auto 被某个推送触发时,它们将被自动删除点。)

如果你真的非常想清空它,你可以在远程存储库中设置receive.denyDeleteCurrent,然后推送删除所有分支,包括当前分支。不过,我不明白你为什么真的需要这样做!

【讨论】:

  • @John: -f 表示--force。它是非快进推送所必需的(推入没有分支先前位置作为祖先的分支)。
  • 由于 --set-upstream 已被弃用,git branch --set-upstream-to=origin/master master 现在可以完成这项工作(设置遥控器)
  • @Cascabel 如何在远程触发git gc --auto,就像您在回答中所说的那样?在本地运行并推送就足够了,还是还有更多工作要做?
【解决方案2】:

以下步骤将轻松完成,请注意在需要时进行主备份。

mkdir  reset
cd reset
 git init
 touch README.md
 git add .
 git commit -m 'Initial commit'
 git remote add origin git@github.com:XXX/xxx.git
 git push --force --set-upstream origin master

【讨论】:

    【解决方案3】:

    当您说“第一次推送”时,您是指第一次推送到分支吗?就像在你推送它之前根本没有代码一样。如果是这样的话……

    如果您想第一次将本地分支 foo 推送到远程分支,您可以这样做:

    git push origin foo:foo
    

    为了删除远程分支foo,你告诉git向它推送“nothing”:

    git push origin :foo
    

    现在你可以随心所欲地重新开始。

    老实说,我不确定服务器上实际保留了什么——但就完全重置分支历史而言,这会起作用。

    (fwiw,我觉得这个界面很可笑)

    【讨论】:

    • 当 master 分支是那里唯一的分支时,你如何做到这一点?我在上面的问题中添加了工作流程。
    • git push origin :master -- 因为它是唯一的分支,也是您签出的分支,这会产生一些错误,解释如何解决问题。 (再次——这将删除该远程分支中的所有内容!)
    • (一个简单的解决方法是git checkout -b master_tmp; git push origin :master
    • 你到底觉得什么是可笑的?
    • 要删除一个远程分支,你“将空虚推给它” 1. 不直观。该语法也可能意味着“不推动任何更改”。 2. 或者真的应该是错误的,因为删除远程分支是一种危险的推送的特殊情况。至少,git push origin :foo 应该需要一个 --force 标志。
    【解决方案4】:

    清空 GitHub 存储库的最佳方法。

    第 1 步: 创建新分支。 git checkout -b master1

    第 2 步:将您的数据添加到其中。

    git add .

    git commit -m "Initial commit"

    git push origin master1

    第 3 步: 现在删除旧的 master 分支。

    git push origin --delete &lt;your_branch&gt;

    【讨论】:

      【解决方案5】:

      您可以git revert 提交,例如git revert HEAD.

      请记住,您提交的内容将驻留在.git 目录中。 (对此你无能为力)

      如果无法访问.git 目录,实际上是不可能删除历史中的提交。

      【讨论】:

      • @Makis:这个答案不正确。您可以删除远程分支,并强制主分支返回其第一次提交。确实,你不能在没有任何提交的情况下离开它,但你可以替换根提交。原始提交将悬空,最终由自动运行的git gc --auto 清理时不时地。
      • Jonas,git 命令(包括推送)通过访问和可能修改 .git 目录的内容来工作。您确实可以通过git push 访问远程的.git 目录。它是间接的和不完整的,但对于这项任务来说也足够了。
      猜你喜欢
      • 2013-12-18
      • 2011-05-06
      • 2010-12-05
      • 2011-03-23
      • 2015-11-05
      • 1970-01-01
      相关资源
      最近更新 更多