问题标签 [git-rewrite-history]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
50490 浏览

git - 在 Git 中编辑根提交?

有一些方法可以从以后的提交中更改消息:

如何更改第一个提交(没有父级)的提交消息?

0 投票
8 回答
38029 浏览

git - 从 git 存储库中删除文件(历史记录)

(已解决,见问题正文底部)
找这个很久了,到现在我有的是:

几乎相同的方法,但它们都将对象留在包文件中......卡住了。
我尝试了什么:

包里还有文件,我是这样知道的:

和这个:

相同...

尝试过git clone的技巧,它删除了一些文件(其中约 3000 个),但最大的文件仍然存在......

我在存储库中有一些大型遗留文件,~200M,我真的不希望它们在那里......而且我不想将存储库重置为 0 :(

解决方案:这是摆脱文件的最短方法:

  1. 检查 .git/packed-refs - 我的问题是我有refs/remotes/origin/master一行远程存储库,删除它,否则 git 不会删除这些文件
  2. (可选) git verify-pack -v .git/objects/pack/#{pack-name}.idx | sort -k 3 -n | tail -5 - 检查最大的文件
  3. (可选) git rev-list --objects --all | grep a0d770a97ff0fac0be1d777b32cc67fe69eb9a98 - 检查这些文件是什么
  4. git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_names'- 从所有修订中删除文件
  5. rm -rf .git/refs/original/- 删除 git 的备份
  6. git reflog expire --all --expire='0 days'- 使所有松散的对象过期
  7. git fsck --full --unreachable- 检查是否有松动的物体
  8. git repack -A -d- 重新包装
  9. git prune- 最终移除这些对象
0 投票
2 回答
1113 浏览

git - 从旧的 Git 提交中删除私有信息

我有一个使用 Git 进行版本化的项目,我想将其开源,但其中包含一些特定于最初使用它的环境的私有信息。我将更改相关信息以从存储库中未包含的配置文件加载。我意识到我应该首先这样做,但是由于私人信息仍然存在于以前的提交中,我该如何从我的历史记录中删除它?我是否只需要根据最新的提交启动一个新的存储库并丢失我的所有历史记录,或者有没有办法在删除任何私人信息记录的同时挽救当前的存储库?

编辑:澄清一下,我不想完全删除包含此私人信息的文件,因为它们仍在使用中。相反,我想删除/清除/更改其中某些字符串的出现。

0 投票
6 回答
21681 浏览

git - 如何从 git 历史记录中的文件中替换文本?

我一直使用基于接口的 git 客户端(smartGit),因此对 git 控制台没有太多经验。

但是,我现在需要在历史记录中的所有 .txt 文件中替换一个字符串(因此,不是擦除整个文件,而只是替换一个字符串)。我找到了以下命令:

我试过这个,不幸的是注意到虽然密码确实被改变了,但所有的二进制文件都被破坏了。图像等都会被破坏。

有没有更好的方法来做到这一点,不会损坏我的二进制文件?

谢谢。

编辑:

我和某事混在一起了。导致二进制文件损坏的实际代码是:

奇怪的是,顶部的代码实际上用我的密码删除了所有文件。

0 投票
4 回答
12168 浏览

git - 使用重写的 Git 存储库历史更新开发团队,删除大文件

我有一个 git repo,里面有一些非常大的二进制文件。我不再需要它们,而且我不关心能够从之前的提交中签出文件。因此,为了减少 repo 大小,我想从历史记录中完全删除二进制文件。

经过网络搜索,我得出结论,我最好的(唯一?)选择是使用git-filter-branch

到目前为止,这似乎是一个好方法吗?

假设答案是肯定的,我还有另一个问题要解决。git手册有这个警告

警告!重写的历史对于所有对象将具有不同的对象名称,并且不会与原始分支收敛。您将无法在原始分支之上轻松推送和分发重写的分支。如果您不知道全部含义,请不要使用此命令,并且无论如何都避免使用它,如果一个简单的单个提交就足以解决您的问题。(有关重写已发布历史的更多信息,请参阅 git-rebase(1) 中的“从上游 REBASE 恢复”部分。)

我们的服务器上有一个远程仓库。每个开发人员都会推入并从中拉出。根据上面的警告(以及我对git-filter-branch工作原理的理解),我认为我无法git-filter-branch在本地副本上运行然后推送更改。

所以,我暂时计划通过以下步骤:

  1. 告诉我所有的开发人员提交、推动和停止工作一段时间。
  2. 登录到服务器并在中央存储库上运行过滤器。
  3. 让每个人都删除他们的旧副本并再次从服务器克隆。

这听起来对吗?这是最好的解决方案吗?

0 投票
5 回答
132151 浏览

git - 重新设置 Git 合并提交

举个例子:

我在主题分支中有一些工作,现在我准备合并回 master:

我从 master 执行合并,解决冲突,现在我有:

现在,合并花了我一些时间,所以我再次获取并注意到远程主分支有新的变化:

如果我git rebase origin/master从 master 尝试,我将被迫再次解决所有冲突,并且我也会丢失合并提交:

有没有一种干净的方法来重新合并提交,所以我最终得到了如下所示的历史记录?

0 投票
4 回答
12640 浏览

git - 如何以非交互方式在 Git 中重新排序提交

什么非交互式 git 命令实现了从之前到之后的变化?

前:

后:

0 投票
8 回答
71542 浏览

git - 如何修改 Git 中的多个提交以更改作者

我在 Git 中进行了一系列提交,现在我意识到我忘记正确设置我的用户名和用户电子邮件属性(新机器)。我还没有将这些提交推送到我的存储库,那么在我这样做之前如何更正这些提交(只有主分支上的 3 个最新提交)?

我一直在看git resetand git commit -C <id> --reset-author,但我认为我没有走在正确的轨道上。

0 投票
5 回答
24049 浏览

git - 如何从 git 存储库中删除旧版本的媒体文件

我有一个 Git 存储库,其中包含几个巨大的媒体文件(图像和音频文件)。这些媒体文件的多个版本已陆续提交到 repo。这些文件是相同资产的连续精炼版本,它们具有相同的名称。

我只想在 Git 存储库中保留最新版本,因为它变得太大了。
最简单的方法是什么?
如何将这些更改正确传播到上游存储库?

0 投票
4 回答
51053 浏览

git - 从 Git 存储库清除文件失败,无法创建新备份

我试图通过运行从我的远程仓库中删除一个文件:

但 Git 抱怨说

无法创建新备份。以前的备份已经存在于 refs/original/
使用 -f rm 强制覆盖备份
:无法删除 /.git-rewrite/backup-refs :权限被拒绝
rm:无法删除目录 /.git-rewrite :目录不为空

这是在我已经删除 Windows 上的 .git-rewrite 目录之后。

如何删除该文件?这是一个 29Mb 的文件,位于我的仓库中,所以我非常需要删除该文件。

我试图删除 中的提交git rebase -i,但显然因为提交触及了很多不同的文件,Git 抱怨冲突,我为了安全而中止了。