问题标签 [git-filter-branch]

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 投票
1 回答
606 浏览

git - 过滤 master 后,如何检索旧 master 上的隐藏更改?

我按照GitHub 的说明从 git 存储库中删除敏感文件,因为我想删除一些不应该签入的二进制文件。

我第一次调用git filter-branch命令失败了:

无法用脏工作目录重写分支。

因为我有本地的变化。因此,我用 隐藏了这些更改git stash,并重新运行了 filter-branch 命令。

然后我按照 GitHub 说明运行了这些命令:

二进制文件的删除似乎完美无缺。但是,当我现在输入 时git stash list,我在旧主服务器上添加的存储条目不会显示。

我所拥有的只是git stash第二次执行 filter-branch 命令之前的输出:

此外,a19db18332b19ea41be888eccfc07e6680d8d6dd是被重写的提交之一。

有没有办法检索隐藏的更改?

0 投票
1 回答
581 浏览

git - 拆分巨大的 git repo

我正在尝试使用此问题中描述的配方拆分 git 存储库,但是有问题的 git 存储库很大并且有数千次提交,因此当我尝试按照描述运行命令并且提交过滤器失败时,命令行限制就会生效. 如果我尝试分阶段进行(首先应用索引过滤器,然后提交过滤器),索引过滤器工作正常,但提交过滤器卡住并开始使用大量内存(3G+),所以我必须杀死它。知道怎么做吗?也许我在这里做错了什么?

对于那些没有阅读其他问题的人,任务是将几个目录从一个非常大的 git repo 拆分到另一个 repo,同时保留与这些目录相关的历史记录。

0 投票
1 回答
2323 浏览

git - 在工作树层次结构中向上移动 .git 文件夹

昨天我在我的 git repo 上做了这些操作之一(见下面的代码片段),以便有效地将我的项目移动到文件夹层次结构中的几个文件夹。这基本上列出了所有文件并向它们添加前缀文件夹名称并相应地更新索引。

旧布局:

新的,所需的布局:

命令:

但是,我不知道的这个命令只修改了master分支。我有大约 8 个其他分支离开 master。当我签出这些其他分支之一时,它会在我将文件夹移动到的新根文件夹级别的原始文件夹结构中签出我的存储库中的所有文件(大约 11,000 个).git

我该如何修复这个混乱?损害已经造成。在我运行之前我有一个.git文件夹的备份,filter-branch但是在这个备份完成之后我有提交,虽然不多,但足以保证在当前的 repo 上找到一个类似补丁的修复程序。我没有看到该filter-branch命令有任何明显的特定于分支的参数。

0 投票
1 回答
1239 浏览

git - git 忽略 $GIT_AUTHOR_DATE - 这是一个错误吗?

编辑摘要:Git 不允许在 1973/03/03 09:46:40 (epoch+100000000s) 之前以其“内部日期格式”(自纪元以来的秒数)给出日期。这是为了允许“20110224”作为“2011-02-24”的缩写形式。--这不是错误:不是真的,但也没有记录。--解决方法:当你不能依赖 git 内部日期时,不要依赖它。--感谢:霍布斯

大家好,

我有一些关于 git filter-branch 的问题,我已经追踪到 git commit-tree。考虑这个脚本:

请注意,env GIT_AUTHOR_DATE="0 +0000"使用“Git 内部格式”将日期设置为 1970-01-01。

但是这个脚本的输出(原始提交)是

现在为什么 git 忽略 $GIT_AUTHOR_DATE?如果这很重要,我git --version会给git version 1.7.1.

0 投票
2 回答
2545 浏览

git - 提取 git 子目录,同时保留重命名历史

我将一个大的源代码树分成两个独立的组件和一个共享的子模块。为了准备这次拆分,我首先将共享的内容移动到一个“公共”目录中,更新了所有引用,并进行了提交。到目前为止,一切都很好。现在我想将该目录提取到一个子模块中。

通常我会这样做

但是在这种情况下,所有有趣的历史都发生在该子目录之外,因此历史会丢失。

我知道保留完整的历史记录是没有意义的,因为这根本不会过滤掉任何数据。但我并不是真的想要回到过去并进行构建,我只想能够查看每个文件所属的提交。

有没有办法在保留单个文件的历史记录的同时保留过滤器分支行为?

0 投票
2 回答
21287 浏览

git - Git - 使用过滤器分支删除具有空变更集的提交

如何使用 git filter-branch 删除没有变更集的提交?

我使用以下方法重写了我的 git 历史记录:

这很好,但现在我有很多带有空变更集的提交。我想删除这些提交。最好在 msysgit 中。

变基并不是一个真正的选择,因为我有超过 4000 次提交,其中一半必须被删除。

0 投票
1 回答
2872 浏览

git - 在一系列 git 提交中提取对单个文件的更改

我使用的构建系统通常要求在执行完整构建之前将项目数据提交到本地存储库。这——连同我经常提交并在推送到公共仓库之前重新设置基准的习惯——意味着我通常在远程头顶上有一堆提交。他们中的大多数人都有像“s”这样的提交消息,因为我知道他们会被压扁。

我在这里遇到的情况是自动化重新调整提交列表的步骤之一。我知道我对某个文件所做的所有更改都不应该推送到公共存储库,我正在寻找一种方法来编辑每个提交,以便将对该文件的更改拆分为单独的提交,稍后我将压缩这些提交变基。

例如,如果来源是 HEAD,那么这是我在顶部的提交:

我想遍历master..master-dave的所有提交,提取对./file.txt的更改,给我:

最后,我会运行 git rebase -i origin/master,将所有“DD”提交压缩在一起,所有“s”提交到“将 pkg 与 master 分支同步”,重新排序,更新 master ,然后推到原点,最后得到:

我很确定答案在于 git filter-branch,但我不知道怎么做。


编辑:

  • --autosquash 修复了“s”提交的烦恼,但这不是主要问题。我仍然不知道如何将更改拆分到特定文件,这必须在我压缩它们之前发生。
  • smudge/clean 过滤器很漂亮,但我不做关键字替换,而且我不认为我想在我的个人分支上维护的更改将是可预测的,足以编写脚本。我认为我总是必须在公共大师之前至少提交一次。
0 投票
3 回答
66222 浏览

git - 从 GitHub 上的 Git 存储库和远程文件中完全删除文件

我不小心添加了一个图像文件夹并提交了。然后,我又做了一个承诺。然后我删除了这些文件git rm -f ./images并再次提交。

现在,我在那个分支(master)中做了更多的提交。在我的 HEAD 中,我没有那个./static/images文件夹。

因此,我的回购规模增加了很多。我怎样才能完全去除这些斑点?我也想从我的远程 GitHub 存储库中删除它。

0 投票
1 回答
2946 浏览

git - 过滤存储库时如何保留标签?

有没有办法以自动方式将存储库及其所有标签移动为另一个存储库的子目录?

由于某些原因,一个项目被拆分为多个存储库。现在我们看到这不是一个热门的想法,并希望将其重新组合在一起。考虑了子模块,但它们确实是一个项目,我们需要在它们之间移动很多文件。

假设我们有存储库 A、B 和 C。我们想要一个项目,其中每个项目都作为子目录:

这可以通过git-filter-branch --tree-filter. 完成,没问题。它甚至也正确地处理了分支,这是一个惊喜。

问题是A、B、C都有标签,也都需要转换。

这可以自动化吗?

0 投票
2 回答
3707 浏览

git - filter-branch 删除额外目录

我正在将几个 Subversion 存储库迁移到 Git,但它们的设置有点奇怪:标准的 trunk/branches/tags 结构位于存储库的几个子目录中。/branches 和 /tags 都是空的,所以 git-svn 导入最终只有主干目录。

我想git filter-branch用来删除额外的主干文件夹,但保持其余部分完好无损:

根据文档中的最后一个示例,这是我目前所拥有的:

在我看来,它sed正在做它的工作,因为这个输入:

产生这个输出:

但是,当我运行整个命令时,出现以下错误:

有任何想法吗?我在 Windows 上使用 git 版本 1.7.3.1.msysgit.0。

更新:现在使用 git 版本 1.9.0.msysgit.0,类似的情况会产生不同的错误(注意.git-rewrite在执行命令之前不存在):

同样的修复最终奏效了。