标签: git-rewrite-history

列出删除任何文件的所有 git 提交

问题

如何列出删除存储库中任何文件的所有提交?(不是特定文件,而是删除任何内容的所有提交)。

语境

我们有一个多年历史的存储库,我们计划将该项目作为开源发布。

我们想要检查是否没有凭据被过滤到公众中。

对于跟踪的文件,我们可以很容易地看到里面有什么,以及过去是否有什么秘密。

但我们想看看“在任何时候,是否存在任何可能泄露秘密的文件”。

我们只想列出所有被跟踪并随后删除的文件,以查看历史记录的这些部分。

git security credentials delete-file git-rewrite-history

7
推荐指数
1
解决办法
395
查看次数

如何恢复git历史记录重写?

我正在改写一个相当大的回购使用的历史,git filter-branch --tree-filter它花了几个小时.我看到git正在使用一个临时目录来存储它的中间工作.这是否意味着如果它被中断,可以重新开始重写?如果是这样,怎么样?

编辑

我正在做的操作是移动几个目录.这些目前在子目录中,但我现在需要它们在根目录中.

例如

dir1
- dir2
- dir3
- dir4
Run Code Online (Sandbox Code Playgroud)

dir1
- dir2
dir3
dir4
Run Code Online (Sandbox Code Playgroud)

当然,我的目录结构比这复杂得多,但这是我想要做的事情的要点.

git git-filter-branch git-rewrite-history

6
推荐指数
2
解决办法
2082
查看次数

如何从Git的历史中永久删除提交?

如何从Git的历史中永久删除提交?

该团队的一名开发人员意外地提交了一个200 MB的文件并将其推送到我们的Git服务器.它被删除了几天,但历史就在那里.我们的代码文件只有大约75 MB,我们有4个分支.由于200 MB文件提交,历史记录将保留,项目文件夹(特别是隐藏的.git文件夹)的大小已经膨胀到接近700 MB.如何从git中永久删除两个签到(提交大文件,删除大文件),就好像它从未发生过一样?如果重要的话,我正在使用`TortoiseGit.

git git-rewrite-history

6
推荐指数
2
解决办法
7140
查看次数

跨多个分支的 Git 交互式变基

我有一个 git repo,它有一个源文件,其中包含一些我希望删除的敏感内容(我不想删除该文件,只需修改其内容)。提交是在项目开发的早期(当时我们只有一个分支),但现在在其他 n 个分支中找到了它自己。

是否有任何 git-fu 我可以运行以在所有分支中清理它?交互式 rebase 一次只能对一个 Head 起作用。

我确实在 github 上找到了这个命令:

git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch DotNet/src/ExternalLibs/GemBox/' \
--prune-empty --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)

但它只适用于删除,而不是修改

A-B-C-**STUPID**-D-E-F
                    \
                     \-G-H-I
                          \-J-K
Run Code Online (Sandbox Code Playgroud)

git rebase git-rebase git-rewrite-history git-branch-sculpting

6
推荐指数
1
解决办法
1144
查看次数

Git命令可以破坏/重写历史记录

你能提供一个(全部或最常见的)操作或命令列表,这些操作或命令会危害git中的历史记录吗?

什么应该绝对避免?

  1. 推送此提交后修改提交(git commit/ git push/ git commit --amend)
  2. 重新启动已经推动的东西

我希望这个问题(如果它还没有在其他地方之前提出过)成为关于git常见的可避免操作的某种参考.

此外,我使用git reset了很多,但我还没有完全意识到我可以对存储库(或其他贡献者副本)造成的损害.可能git reset有危险吗?

git github git-rewrite-history

6
推荐指数
3
解决办法
1472
查看次数

我可以重写整个git存储库的历史记录以包含我们忘记的内容吗?

我们最近完成了从Mercurial到Git的转换,一切顺利,我们甚至能够获得所需的转换,使所有内容在存储库中看起来/工作相对正确.我们添加了一个.gitignore并开始了.

但是,只要我们加入/合作任何旧的功能分支,我们就会遇到一些极端的减速.稍微探索一下,我们发现,因为当我们查看其他提交而没有合并时.gitignore,它只被添加到develop分支中,因为它正在窒息,试图分析我们所有的构建工件(二进制文件)等...因为它有...没有.gitignore这些旧分支的文件.

我们想要做的是有效地使用.gitignore插入新的根提交,以便它可以追溯填充所有头/标签.我们很乐意重写历史记录,我们的团队规模相对较小,所以当历史重写完成后,让每个人都停下来执行此操作并重新启动他们的存储库是没有问题的.

我已经找到了关于将master重新设置到新的root提交上的信息,这对master来说很有用,问题是它在旧的历史记录树上保留了我们的功能分支,它还用新的提交日期/时间重放整个历史记录.

任何想法或我们在这一个运气不好?

git git-rebase git-filter-branch git-rewrite-history

6
推荐指数
1
解决办法
443
查看次数

将整个开发分支重新定位到新的主分支

我正在使用一个理论上应该遵循Gitflow工作流程的存储库(参见Vincent Driessen 成功的git分支模型).但是,存储库上的初始提交是在develop分支上进行的,并且没有master可见的分支.它即将发布时间,我需要创建一个master分支,反映项目的生产就绪状态,应该从一开始就存在.请记住,develop分支有多个功能分支.存储库完全是本地的,尚未推送.

我的想法是创建一个孤儿分支master并将develop分支重新分支到它上面,但我不知道我该如何去做.

那么,我怎样才能创建master分支,就像它从一开始就创建一样?

更新:在我的情况下,第一次提交develop不是应该被认为适合生产的提交,因此使用它作为初始master提交将是不明智的.项目处于此状态的原因是因为它在决定使用Git时最初没有使用VCS.

git version-control git-rebase git-flow git-rewrite-history

6
推荐指数
1
解决办法
3215
查看次数

我应该在镜像回购或原始版本上运行BFG吗?

我想删除我的git仓库中不再存在的两个文件.

我把它们放入,承诺并试图推动,但它们太大了.所以我把它们拿出来,继续工作,然后承诺,试图推,但它仍然给了我同样的错误.我认为他们仍然在历史的某个地方.

我认为我使问题变得更糟,因为我继续在那个分支工作并再做一次提交.然后我将该分支合并回主分支.

所以我搜索了一个解决方案并找到了bfg.

但是页面上的说明对我来说没有意义.

首先,

$ git clone --mirror git://example.com/some-big-repo.git
Run Code Online (Sandbox Code Playgroud)

我应该从哪里克隆?我在github.com上的远程仓库没有我提交的提交和合并,因为我添加了大文件.但是说明看起来我应该从那里得到它.(我从我当地的回购克隆.)

下一个,

$ java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git
Run Code Online (Sandbox Code Playgroud)

some-big-repo.git镜像回购还是正常的本地回购?(我使用了镜像回购.)

然后我检查了我的历史记录是否已更新并尝试过,

$ cd some-big-repo.git
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
Run Code Online (Sandbox Code Playgroud)

(我在这个镜像克隆中)我收到了一个错误.

remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what …
Run Code Online (Sandbox Code Playgroud)

git git-rewrite-history bfg-repo-cleaner

6
推荐指数
1
解决办法
1286
查看次数

将一个父级的提交重新绑定到另一个父级

我有一个正在处理的现有存储库,但最近我学到了很多关于良好实践和 git 本身的知识。我想根据自己的喜好改变我的历史,尤其是一些早期的提交。

以下是当前历史的片段。我想将 e5cb9b8 提交重新绑定到 1a92e84 上,这样我就可以在历史图中只有一个/两个级别的深度(从视觉上看,更改 e5cb9b8 的父级)。我试过变基

git rebase -p --onto 1a92e84 e5cb9b8 master
Run Code Online (Sandbox Code Playgroud)

并挑选到从 9ecbe00 创建的新分支。Cherrypicking 让我获得了平坦的历史,rebase 失败并显示以下消息

错误:提交 ca230d8c048d22de6f219da8a22e70a773827c38 是一个合并,但没有给出 -m 选项。

致命:樱桃挑选失败

无法选择 ca230d8c048d22de6f219da8a22e70a773827c38

* | 45a0a21 - (7 weeks ago) #17 Updates README.md - Kamil Pacanek
|/
*   ca230d8 - (8 weeks ago) Merge pull request #2 from KamilPacanek/feat/rmb-support-removing-parts - Kamil Pacanek
|\
| * e5cb9b8 - (8 weeks ago) Adds support for removing parts on ReactorCells - KamilPacanek
* |   1a92e84 - …
Run Code Online (Sandbox Code Playgroud)

git rebase git-rewrite-history

6
推荐指数
1
解决办法
5169
查看次数

使 git `replace` 提交永久(或类似的)

我正忙着将我现有的所有 SVN 存储库转换为 Git,同时也借此机会利用 Git 的能力轻松重写一些历史记录。为此,我还使用 git filter-repo 来删除不需要的文件并通过脚本进行一些标准重命名。(注意:它们都是我工作的单独存储库,因此不需要更改历史的免责声明,我知道注意事项:))

filter-repo工作得很好(使用 Python 脚本功能,而且它比 filter-branch 快得多),但它会创建替换提交。一旦回购重组完成,我想再次摆脱所有这些替换提交,以真正融入改变的历史。最好通过脚本,因为我有很多有很多提交的存储库。然而,当我在谷歌上搜索如何做到这一点时,我空手而归......

原因是:我的 Git 命令行客户端并没有被这个困扰,但是我的 GUI(Windows 版 SmartGit)一直在抱怨它不支持替换提交(它检测到 refs/replace-refs 它说)。无论如何,它显示 repo 内容 OK,我可以从那里继续填写丢失的提交消息,做一些更多的清理等,但我没有进一步看,所以谁知道它最终会破坏什么?

我已经找到了一种解决方法,将每个存储库推送到添加到本地 Gitea 服务器的空存储库,然后删除本地存储库并将其克隆回本地。虽然我可以在余下的转换过程中接受它,但我一直想知道我是否可以/本可以做得更有效?

git smartgit git-rewrite-history git-filter-repo

6
推荐指数
1
解决办法
393
查看次数