在新克隆上使用 git-filter-repo 从 Git 历史记录中删除文件

问题描述 投票:0回答:2

我正在按照这个答案从 Git 历史记录中删除包含凭据的单个文件。我有 Git 2.35.1 和 filter-repo 22826b5a68b6。我需要的命令显然是:

git-filter-repo --path auth.json --invert-paths

如果我尝试将其应用到我的工作存储库,我会收到此错误:

Aborting: Refusing to destructively overwrite repo history since
this does not look like a fresh clone.
(expected freshly packed repo)

所以我用

git clone
查看了一个新副本,命令成功运行:

Parsed 861 commits
New history written in 0.69 seconds; now repacking/cleaning...
Repacking your repo and cleaning out old unneeded objects
HEAD is now at 7212384 Update app.css
Enumerating objects: 8203, done.
Counting objects: 100% (8203/8203), done.
Delta compression using up to 24 threads
Compressing objects: 100% (2310/2310), done.
Writing objects: 100% (8203/8203), done.
Total 8203 (delta 5630), reused 8196 (delta 5623), pack-reused 0
Completely finished after 2.85 seconds.

我可以看到该文件已被删除。但当我去推时:

git push --force
fatal: No configured push destination.

由于某种原因,它丢失了克隆的遥控器,所以我手动将其添加回来:

git remote add origin [email protected]:abc/xyz.git

失败并显示:

fatal: The current branch master has no upstream branch.

所以我添加了

git push --set-upstream origin master

但这也失败了:

To git.example.com:abc/xyz.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git.example.com:abc/xyz.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

但我知道自从检查以来没有任何内容被推送到这个存储库。重复该过程会得到相同的结果。如果我执行

git pull
来更新它,它会再次失败并出现
this does not look like a fresh clone
错误,就回到我开始的地方。

我绕了好几次,最终克服了所有错误,却发现这对我的存储库没有任何影响——文件仍然在那里。

所以我的问题是,要使此过滤过程在新克隆的存储库上运行,我应该执行哪些具体步骤?

git repository git-rewrite-history
2个回答
18
投票

你是如此接近...

您需要在上一步中

git push --force
的原因是因为您将清除远程上的提交并用新的提交替换它们。由于您的遥控器不见了,请跳过第一个强制推送命令,然后您只需在最后的推送命令中添加强制即可:

git push --set-upstream origin master --force

旁注: 我几乎总是更喜欢使用

--force-with-lease
而不是
--force
,因为它稍微安全一些,因为如果有人在您上次获取期间向远程分支添加了新提交(或者在这种情况下,克隆)并推送,你还没有看到。直接把他们吹走可能是不礼貌的。使用
--force-with-lease
时,如果出现错误,只需执行
git fetch
,查看新提交并决定是否可以删除它们。如果是,请再次使用
--force-with-lease
,它将起作用(除非在提取后的最后一分钟再次出现新的提交)。 在这种特殊情况下,您要重新添加遥控器,您

必须

首先获取,否则--force-with-lease将无法工作,如果是我,如果有可能出现新的提交,我可能会考虑这样做在您克隆的时间和您即将强制推送重写的存储库之间的遥控器上。在这种情况下,我会将您的最终命令更改为以下步骤:

git fetch
# inspect origin/master to see if new commits appeared after your clone
git push --set-upstream origin master --force-with-lease

或者,也许在您的情况下,一旦您决定要重写分支,请暂时锁定该分支(或删除对其的权限),并在强制推送后将其解锁。然后您就可以确定在您完成之前没有人会添加提交。


7
投票
git init

的评论 - 问题在于操作顺序。在它起作用之前我做了很多次,我把它变成了一个脚本,以明确需要什么以及按什么顺序:

#!/usr/bin/env bash
set -xv
git clone [email protected]:abc/xyz.git project
cd project
git filter-repo --path auth.json --invert-paths
git remote add origin [email protected]:abc/xyz.git
git push --set-upstream origin main --force

完成此操作后,我在更新现有克隆时遇到了很多问题,但通常通过接受来自远程的所有更改来解决这些问题。

© www.soinside.com 2019 - 2024. All rights reserved.