我在 GitHub 上创建了一个 Gist,我看到了我不想让任何人看到的信息。从那以后我更新了文件,但每个人仍然可以访问文件的旧版本。
除了删除要点,有没有办法明确删除那个特定的修订?
我发现我不是唯一一个遇到这种问题的人(Git:删除单个远程修订版),但我没有设法删除修订版。此处指示的过程似乎有助于删除一些文件。我想删除整个修订版。
我在 GitHub 上创建了一个 Gist,我看到了我不想让任何人看到的信息。从那以后我更新了文件,但每个人仍然可以访问文件的旧版本。
除了删除要点,有没有办法明确删除那个特定的修订?
我发现我不是唯一一个遇到这种问题的人(Git:删除单个远程修订版),但我没有设法删除修订版。此处指示的过程似乎有助于删除一些文件。我想删除整个修订版。
Github 有一个关于删除敏感数据的帮助页面:
http://help.github.com/removing-sensitive-data/
由于 gist 只是 git 存储库,您应该能够在本地克隆您的 gist,在那里进行清理并强制推送以使用清理后的 repo 覆盖 github 版本。
是的,经过考虑:如果<commit>
是您要“删除”的提交,请执行
git rebase -i <commit>^
将行标记<commit>
为edit
,保存并退出。
git 会将工作目录设置为您提交后的状态<commit>
。修复文件,使用git add
和git commit --amend
修复提交。然后做git rebase --continue
。如果下一次提交所做的唯一事情是删除敏感数据,它可能会被自动删除,因为它在现在修改的提交之后不包含任何更改。
然后,执行 agit push -f
强制更新(因为它现在是非快进的,这意味着它会更改已发布的 git 历史记录)。
公认的答案很好,但有点难以理解。这是相同的答案,但更甜一些。
正如 Tilman Vogel 所说,gists 只是存储库,因此这种方法适用于 github 存储库和 gists。
假设只有一个版本包含您不想显示的密码。您已在删除密码的情况下签入新版本,并希望摆脱以前的版本。如果有许多提交显示密码,您应该能够调整此过程。
第一件事是修复必须在您的本地机器上完成(而不是在 github 上)。为此,首先在本地克隆 gist。如果单击私有克隆 URL,github 上的 gist 页面应向您展示如何创建私有克隆。就像是:
git clone git@gist.github.com:421xxx1.git gist-421xxx1
这为您提供了一个本地副本,您需要重新设置基准(意味着与版本混在一起)。
cd gist-421xxx1
git rebase -i eexxaa^
其中 eeccaa 是包含密码的(第一个)版本。您可以从 gist page revisions 列中获取此编号。^ 是必需的。该命令的意思是“让我以交互方式将版本从 eexxaa 更改为最新版本。该命令将打开一个编辑器,该编辑器在存储库中的每个版本的每一行都填充了一个命令。默认命令是“pick”,意思是“使用或保留这个版本”。
编辑器中的第一行应该类似于
pick eexxaa <- the version with the password
pick ffxxbb <- the first version without the password
将此更改为
pick eexxaa
squash ffxxbb
即在没有密码的版本上将“pick”一词更改为“squash”。这将要求 rebase 将新(无密码)版本压缩为旧(携带密码)版本,实质上是删除版本 eexxaa。显然,您的版本将不是 eexxaa 或 ffxxbb,请不要在任何地方使用 eexxaa 或 ffxxbb!
正如@kand 所指出的,您应该squash
每个版本都包含密码。
在编辑器中保存并退出(如果是 vi :x)。变基现在应该打开一个新的编辑器,显示两个版本的提交消息,并要求一个组合的提交消息。对于一个要点,这些消息很可能是空的,但你确实需要在这里放一些东西,否则 rebase 将中止。输入一条消息,保存并退出,rebase 应该完成。
您现在拥有一个没有包含密码的版本的存储库。要回到要点上,请使用:
git push -f
这将强制更改到 github 存储库。点击刷新,您应该能够在浏览器中检查违规版本是否已从右侧的修订列中消失。
就是这样!
如果您不关心在 gist 上显示任何修订,您可以执行以下操作以消除所有历史记录并仅显示一个修订。
git clone some-gist-repo
cd some-gist-repo
git rebase -i --root $tip
您将能够在您的编辑器中看到该要点的所有提交。只需选择第一个并将其他所有内容替换为s
or squash
。完成后,保存并添加提交消息,然后像这样强制推送到 master,你就很好了。
git push -f origin master
唯一可见的修订是添加文件,仅此而已。
如果要从存储库中完全删除某些内容,则需要使用 git filter-branch。
添加到meesern的答案。当您尝试 squash 或 fixup 和 rebase--continue 时,您需要添加评论或--allow-empty-message
. 这很耗时,而且不知何故,我的提交并没有通过这种方式脱离主旨的修订列表。
我找到了一个更简单的解决方案:您可以删除 rebase 待办事项列表中不必要的提交行:wq!
,git rebase --continue
, 和git push -f
.