从远程删除敏感分支,但保持文件在本地提交

问题描述 投票:1回答:1

我的本地git存储库有2个远程控制器:privatepublic。错误地,我运行了git push public feature_branch,所以现在feature_branch上的代码公开了,尽管它应该保持隐藏状态(现在)。这不是一个很大的隐私问题,但是我仍然想解决它。

我已经deleted the branch using the GitHub GUI。我还需要做其他事情吗?我不希望有人设法在该分支公开可见的30秒内克隆该存储库-我只关心缓存或其他新的git clone现在可以下载的内容。

现在运行git push public --delete feature_branch会得到error: unable to delete 'feature_branch': remote ref does not exist,所以看来是正确的。

[我知道git filter-branch,但我这样阅读它时首先要处理的数据不是我要提交的-我确实想提交代码,只是在决定这样做之前不要公开使用它等一下。

git github git-filter-branch
1个回答
1
投票

在这种情况下,您已经完成了所有需要做的事情。

((如果您愿意,可以在这里停下来。)

长时:如何思考

Git实际上就是关于[[commits。 Git存储库可以看作是一个大型的提交数据库(或者实际上是Git objects>],但是提交是与您一起使用的级别的数据库),并且您(或至少是Git)将检索这些对象通过其键,即其哈希ID。但是,更准确的描述了Git仓库的图片是作为[[two

数据库的:一个很大的Git对象,包括提交,以及一个很小的(或至少通常小得多)的

names] >。这些名称包括所有分支和标记名称。名称存在的原因是双重的:

    哈希ID大而丑陋,没有人会记住它们。每个名称
  • 记住

为我们分配一个哈希ID。

尤其是组成链。 Git查找

  • old
  • 提交的方式是找到

    latest提交(其哈希ID存储在分支名称中)并向后工作。承诺以这种方式找到

  • 无法
  • (从名称开始无法到达,如果需要,可以向后工作)无法删除。也许不是马上,但很快就可以满足大多数人的目的。 (您偶然遇到的安全问题(偶然提交然后推送敏感数据)是不能或至少不能假设“很快”的地方。)

    因此名称使我们find提交。如果它们没有名称,我们将找不到它们,它们也可能不存在(不久将不存在)。名称不必直接找到,而只能间接找到。但是,一旦作出提交,就不会改变。因此,从儿童提交到其父母,所有提交始终(总是)仅指向[[backwards。新的提交不影响现有的提交。 Git只能在

    backwards

    上工作,从名称到提交到父母再到祖父母,等等。克隆存储库的操作(在中间)是做这两项事情,尽管顺序不完全—内部有点混乱:

    首先,他们访问了自己的姓名数据库。

      我们的

    Git通常采用这组名称,并且
  • 扔掉其中大多数:

    在各种条件下,我们不保留,不保留某些或全部

      tag
    名称,在这里实际上不值得描述。

  • 我们保留其branch

    名称,但将其重命名为我们的
  • remote-tracking
  • 名称(例如,用git filter-branch代替origin/master)。

    如果我们想保持all

    名称不变,我们可以使用master(这会带来很多后果,我们将在此处跳过)。我们通常不这样做,因为它对正常工作没有用。
  • 最后,原始存储库将移交所有提交,或者无论如何我们可以通过复制的名称找到所有提交。

  • 结果是一个新的存储库:一对新的数据库。
  • 1
  • 我在上面说过[[中间,因为git clone --mirror实际上有六个步骤:

    创建一个新的空目录(或使用现有的空目录);

    在此目录中创建存储库,并在那里进行其余工作;

    添加名为git clone或其他选定名称的
      远程以保存URL;
    1. 进行所需的任何其他配置;
  • 运行origin,它将进行数据库复制;
  • 运行git fetch
  • 这是最后一步-git checkout-在新克隆中创建一个
  • branch
  • 名称。在此步骤中签出的分支是Git在git checkout推荐的分支,通常是origin,或者是您在master命令行上选择的另一个名称。
  • 2
  • 当您使用GitHub GUI在GitHub上的Git中删除

    分支名称时,此:

    从名称数据库中删除了

    名称

    因此,进行了一些提交
      unreachable
    ,以便不会被看到,因此也不会被复制。
  • 因此,您创建的任何克隆都没有远程跟踪名称(重命名的分支名称),也没有提交(在复制过程中未找到并且未转移)。3
  • 1存储库所包含的不仅仅是这两个数据库。例如,每个名称-用Git的术语表示的每个[[ref

    reference-都可以拥有自己的先前存储的哈希ID的小型数据库。这些是
    reflogs
    ,实际上只是git clone中的纯文本文件。但是这些不会被复制。仅复制两个主要数据库,并且名称一个不是按原样复制的:它是通过访存步骤重建的。

    通常,当您使用存储库中的提交时,您需要Git将一个特定提交的快照提取到您的work-tree中。从非常强烈的意义上讲,工作树不是存储库本身的一部分:repository

    .git/logs/目录中的内容。所谓的bare克隆缺少工作树,但仍然是存储库;大多数服务器端Git,例如GitHub上的,都是裸克隆。

    2

    如果愿意,可以在此处选择一个tag名称,在这种情况下,.git会在该名称中显示detached HEAD和no分支名称。新克隆。

    3

    Git从未做出过特别强的security承诺,因此可能存在一些方法可以欺骗另一个Git(位于git checkout)以允许复制提交。但是,您希望防止意外访问,而不是故意访问。
  • © www.soinside.com 2019 - 2024. All rights reserved.