如何删除github gist的特定版本?

ndasle7k  于 2023-09-29  发布在  Git
关注(0)|答案(8)|浏览(148)

我在GitHub上创建了一个Gist,我看到了我不想让任何人看到的信息。我更新了文件,但每个人仍然可以访问文件的旧版本。
除了删除Gist之外,是否有方法可以明确删除该特定修订版?
我看到我不是唯一一个有这种问题的人(Git: delete a single remote revision),但我没有设法删除修订。这里显示的过程似乎有助于删除某些文件。我想删除整个修订版。

q1qsirdb

q1qsirdb1#

Github有一个关于删除敏感数据的帮助页面:
http://help.github.com/removing-sensitive-data/
由于gist只是git仓库,你应该能够在本地克隆你的gist,在那里做清理,并做一个强制推送,用清理后的仓库覆盖github版本。
是的,想了想之后:如果<commit>是你想要“移除”的提交,那么

git rebase -i <commit>^

<commit>的行标记为edit,保存并退出。
git会将工作目录设置为你提交<commit>后的状态。修复文件,使用git addgit commit --amend修复提交。然后执行git rebase --continue。如果下一次提交所做的唯一一件事就是删除敏感数据,那么它可能会被自动删除,因为在现在修改的提交之后,它不包含任何更改。
然后,执行git push -f命令来强制更新(因为它现在是非快进的,这意味着它会更改已经发布的git历史记录)。

qlzsbp2j

qlzsbp2j2#

公认的答案是好的,但有点难以理解。这是同样的答案,但有点甜。
正如Tilman Vogel所说,Gists只是存储库,因此这种方法适用于Github存储库和Gists。
让我们假设只有一个版本包含您不想显示的密码。您已签入删除了密码的新版本,并希望删除以前的版本。如果有许多提交显示密码,您应该能够调整此过程。
首先,修复必须在本地机器上完成(而不是在github中)。要做到这一点,首先要在本地克隆gist。gist在github上的页面应该会告诉你如何创建一个私有克隆,如果你点击私有克隆的URL。例如:

git clone [email protected]:421xxx1.git gist-421xxx1

这给了你一个本地副本,你需要变基(这意味着在版本中乱翻)。

cd gist-421xxx1
git rebase -i eexxaa^

其中eeccaa是包含密码的(第一个)版本。您可以从要点页面修订栏中获得此数字。^是必需的。该命令的意思是“让我以交互方式将版本从eexxaa更改为最新版本”。该命令将打开一个编辑器,该编辑器中每行都有一个命令,对应于存储库中的每个版本。默认命令是'pick',意思是'使用或保留此版本'。
编辑器中的第一行应类似于

pick eexxaa    <- the version with the password
pick ffxxbb    <- the first version without the password

将其更改为

pick eexxaa    
squash ffxxbb

即在没有密码的版本上将单词“pick”更改为“squash”。这将要求变基将新的(无密码)版本压缩到旧的(携带密码的)版本中,实际上删除了版本eexxaa。很明显你的版本将是eexxaa或ffxxbb以外的版本,不要在任何地方使用eexxaa或ffxxbb!
正如@kand所指出的,您应该squash包含密码的每个版本。
在编辑器中保存并退出(如果是vi:x)。变基现在应该打开一个新的编辑器,显示两个版本的提交消息,并要求一个合并的提交消息。这些消息很可能是空的,但是你需要在这里放一些东西,否则变基将中止。键入一条消息,保存它并退出,变基应该完成。
您现在有了一个没有包含密码版本的存储库。要回到要点,请用途:

git push -f

这会将更改强制到github repo上。点击刷新,你应该能够在浏览器中检查出有问题的版本已经从右手边的修订栏中消失了。
就是这样!

ig9co6j1

ig9co6j13#

如果您不关心显示要点上的任何修订,您可以执行以下操作来消除所有历史记录,只显示一个修订。

git clone some-gist-repo
cd some-gist-repo
git rebase -i --root $tip

你可以在你的编辑器中看到所有的提交。只需选择第一个,并将其他所有内容替换为ssquash。完成后,保存并添加一条提交消息,然后像这样强制推送到master,就可以了。

git push -f origin master

唯一可见的修订是添加文件,仅此而已。

ergxz8rk

ergxz8rk4#

如果你想从仓库中完全删除一些东西,你需要使用git filter-branch。
http://git-scm.com/docs/git-filter-branch

vq8itlhq

vq8itlhq5#

2022-03测试
基于squash方式的许多解决方案。
我只是直接说删除最后一个(或多个)提交
(没有挤压,没有新的提交版本生成),这可能具有共同的情况。

删除提交解决方案

git rebase -i eexxaa^步进时,
只需将最后一次不需要提交标记为drop,保存它。
最后git push -f
然后将降版也在要点页中删除。

gist的repo url从哪里获取?

只要打开要点页面>复制浏览器地址栏中的URL,
使用git clone $the_url,它可以工作。
注意:使用http(s)也需要github access token而不是密码;
访问令牌只需要gist权限(可以强制推送)

mdfafbf1

mdfafbf16#

这是对Meesern的回答。当您尝试压缩或修复并变基--continue时,需要添加注解或--allow-empty-message。这是很耗时的,而且不知何故,我的提交并没有因为这样做而离开gist的修订列表。
我找到了一个更简单的解决方案:您可以删除rebase to-do列表中不必要的提交行,:wq!git rebase --continuegit push -f

9wbgstp7

9wbgstp77#

我尝试了其他答案,但有两个问题:
1.我不能把它变基,我想这是因为仓库里有没有消息的提交。
1.我不能推它(是的,用force)。
我解决了这两个问题,首先在第一次提交时创建另一个分支,然后cherry-picking一个接一个地处理其余的提交,而不是自动提交它们(这样我就可以在提交之前编辑它们)。
之后,我将master分支重置为新分支:git switch master && git reset --hard temp
在推送之前,我将遥控器更改为SSH版本:
git remote set-url origin [[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection) :<<gist id>>.git
然后,使用git push --force,它推动并改变了要点修订。

bvjxkvbb

bvjxkvbb8#

以前的答案都没有完全烤或为我工作,所以我推出了我自己的。在这里分享它,以防对任何人都有用。脚本中有一些错误检查,但请检查它并检查您正在做什么,因为这确实有可能破坏数据。
保存下面的脚本并执行,提供Gist的URL作为参数。如果提供的URL有一个特定修订的路径,那将被用于变基,否则它将把你的要点重置为“提示”-所有以前的提交将被删除。
初始克隆后会有一个暂停,以便您可以根据需要进行其他编辑。

gist-clean.sh

#!/usr/bin/env bash

BASE_URL='gist.github.com'
GHUSER=$(git config --get user.name 2>/dev/null)

_usage() {
cat <<EOF

Reset a GitHub gist to clean up or remove sensitive information
usage: ${0##*/} <gist-url>

  if the URL supplied contains a revision ID (hash),
  then that revision will be used as the base.

  to get URLs to specific revisions:
    - browse to the gist on ${BASE_URL}${GHUSER:+/$GHUSER}
    - click "Revisions"
    - locate the revision you want to base from
    - click the 3 dots next to the filename -> "View file"
    - copy the URL

EOF
}

case $1 in
    -h|--help|'') _usage; exit;;
esac

[[ -n $1 ]] || { echo "supply a gist URL"; exit; }
[[ -n $GHUSER ]] || { echo 1>&2 "couldn't fetch GitHub username"; exit 1; }

if [[ $1 =~ ^https://${BASE_URL}/${GHUSER}/([a-f0-9]{32,40})/?([a-f0-9]{32,40})? ]]; then
    GIST_URL=${BASH_REMATCH[0]}
    GIST_ID=${BASH_REMATCH[1]}
    REV_HASH=${BASH_REMATCH[2]}
    CLONE_URL="https://${BASE_URL}/${GIST_ID}.git"
    TEMP_DIR="/tmp/gist${GIST_ID}"
    rm -rf "${TEMP_DIR}" 2>/dev/null
    mkdir -p "${TEMP_DIR}"
    if ! git clone "${CLONE_URL}" "${TEMP_DIR}" ; then
        exit 1
    fi
    cd "${TEMP_DIR}" || exit 1
    if [[ -n ${REV_HASH} ]]; then
        git reset --hard "${REV_HASH}"
    fi
    BRANCH=$(git symbolic-ref --short HEAD)
    cat <<-EOF
    ┌──────────────────────────────────────┐
    │                                      │
    │ PAUSED - YOU CAN NOW EDIT THE FILES  │
    │                                      │
    │           !!! WARNING !!!            │
    │                                      │
    │ ALL CONTENTS OF THE REMOTE GIST WILL │
    │  BE REPLACED BY THE LOCAL COPY, AND  │
    │     ALL REVISIONS WILL BE LOST!      │
    │                                      │
    └──────────────────────────────────────┘
    EOF
    read -r -p 'press <ENTER> to continue or ⌃c to ABORT '
    rm -rf .git
    git init
    git add .
    git commit -m 'initial commit'
    git remote add origin "[email protected]:${GIST_ID}.git"
    git push --set-upstream origin "$BRANCH" --force
    cd ..
    rm -rf "${TEMP_DIR}"
    open "${GIST_URL}"
else
    echo 1>&2 "does not appear to be a valid gist URL"
    exit 1
fi

范例:

./gist-clean.sh https://gist.github.com/your-git-username/f184a9c638b75525a65b3e1a7298e6d7/30e87b313bdba9a4bd92746418217ddda958b8cd

相关问题