标签: git-rewrite-history

带索引过滤器的Git filter-branch不起作用,并按预期删除目录

主分支中Git repo foo的结构

foo/refs/a.txt  
foo/bar/refs/b.txt  
Run Code Online (Sandbox Code Playgroud)

在其他分支refs/可能在许多其他地方

目标

从Git(历史)环境中删除目录引用的所有实例(及其内容):使用Git Bash的Windows 7

删除引用(Git没有涉及,尝试这只是为了看它自己工作)

find . -name refs -depth -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)

成功,所有refs/和他们的内容被删除(如果我不使用-depth,find会报告一个错误,即dirs不存在,即使它们被正确删除).

从Git中删除引用

git filter-branch --index-filter \
'find . -name refs -depth -exec git rm -rf --cached --ignore-unmatch {} \;' \
--prune-empty --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)

通过重写Git历史记录从Git中删除目录引用

如可以在图片中可以看出(想temp/atemp/foo)命令贯穿并重写所有提交,但没有refs/被取出,让不知何故发现的输出没有恢复到filter-branch --index-filter预期.

类似的事情似乎对其他人有用.
我错过了什么?

PS.是的,我已经阅读了数百个关于此的数小时的帖子,文章等,但它对我来说无效.

git git-filter-branch git-rewrite-history

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

如何删除git中一个文件的历史记录,仅保留最新版本?

我在git储存库中有一个很大的二进制文件,在几次提交中已更改了它。这些提交还包括对其他文件的更改。我只想在存储库中拥有二进制文件的最新版本,但想保留在这些提交中更改过的其他文件的历史记录。

所有有问题的提交都已被推送到github,并已被团队中的其他成员撤出。

我怎样才能做到这一点?

编辑:我不相信这是其他引用问题的重复。如以下评论中所述,我已经看过这个问题,但想要删除文件的每个版本,但最新版本除外。另一个问题的答案中未解决此标准。

git git-rewrite-history

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

如何重写Git历史记录以便所有文件都在子目录中?

我想将多个Git存储库(比如repoA和repoB)合并到一个新的存储库中.新存储库(repoNew)应该在单独的子目录中包含每个repoA和repoB.由于我到目前为止只在本地工作,我可以做我想要的任何存储库.

在这种情况下,似乎标准的方法是使用git filter-branch重写每个repoA和repoB的历史,使它看起来好像它们一直在子文件夹中,然后将它们合并到repoNew中.

第一步是困扰我的事情.我很清楚如何回答历史记录,以便所有文件(除了我已经移动过的文件)都在子目录中?(Dan Molding的答案),这正是我想要的.

他提出了类似的建议:

git filter-branch --prune-empty --tree-filter '
if [[ ! -e repoA ]]; then
    mkdir -p repoA
    git ls-tree --name-only $GIT_COMMIT | xargs -i mv {} repoA
fi'
Run Code Online (Sandbox Code Playgroud)

结果应该是下面的文件夹结构<repoA-GIT-base>现在应该在<repoA-GIT-base>/repoA.然而,这种情况并非如此.以上命令在不同的提交中随机失败,并显示"mv:无法将'src'移动到'repoA/src'之类的消息

如上所述重写历史记录时如何避免错误的提交?

编辑:

您应该考虑.gitignore从移动中排除这样:

git filter-branch --prune-empty --tree-filter '
if [[ ! -e repoA ]]; then 
    mkdir -p repoA;
    git ls-tree --name-only $GIT_COMMIT | 
    grep -ve '^.gitignore$' | 
    xargs -i mv {} repoA; 
fi'
Run Code Online (Sandbox Code Playgroud)

该命令似乎仍然随机失败.我试了好几次,每次在不同的提交中都发生了"无法移动"的失败.我观察到,当我排除.gitignore …

git git-filter-branch git-rewrite-history

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

非线性合并后如何恢复线性git历史记录?

很少提交,我不小心在我的master分支中进行了非线性合并。我习惯于一直尝试保持线性历史记录,因此现在我想恢复线性度。

我做了一个虚拟仓库,它模拟了我为了使其更简单而遇到的真实情况,这是它的GitHub链接:https : //github.com/ruohola/test-merge

这是的输出git log --oneline --graph --date-order

* 88a4b7e (HEAD -> master, origin/master, origin/HEAD) 11
* 5aae63c 10
*   5506f33 Merge branch 'other'
|\
| * b9c56c9 9
* | 3c72a2a 8
| * 8d2c1ea 7
| * 35f124b 6
* | 7ca5bc1 5
* | b9e9776 4
| * fd83f02 3
|/
* 4fa8b2e 2
* cbdcf50 1
Run Code Online (Sandbox Code Playgroud)

Sourcetree中的相同图形:

git登录sourcetree

这是mspaint可视化的图像,显​​示了我希望如何使我的主人看起来像:(
本质上应该像我在合并之前要重新设置基础)

想要的最终结果

我知道这可能不是最佳做法,并且我熟悉重写历史记录的后果(尽管没有人在此分支上工作),但仍然希望能够做到这一点。如何做到这一点?

git git-merge git-rebase git-rewrite-history

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

从存储库历史记录中删除大文件后,Git repo仍然很大

我有一个代码库(到现在为止)使用git来存储它的依赖项.存储库本身在这里可用(警告:它是巨大的).不用说,我需要从存储库历史记录中删除依赖项,以便将其减少到合理的大小.

我首先使用David Underhill的说明lib从历史记录中删除目录.然而,即使在这样做之后,存储库仍然超过300M.发布git prunegit repack帮助,但它仍然超过180M.

为了找到任何臃肿的斑点,我发出了

git verify-pack -v .git/objects/pack/pack-*.idx | grep -v chain | sort -k3nr | head
Run Code Online (Sandbox Code Playgroud)

结果如下:

105526b5d3d398b9989d88c2f9fc2d1dc96a85b8斑点35685609 33600527 31978828 d296935e6ac5f3f58b50c789394c9769116e9c34团块35658016 33593241 112485744 50636f931180a32764edadd854968a971a083f8a团块28360290 25897864 233390 b9e4dd37428e879a258f297b7f5bcfb9ba869695团块13108002 11640713 66661788 08d2720b2414aa07ce419b17d5f80c333c7313b7团块12551621 11124009 89231035 6197a478a461275a0396f20c28487e9ae619a5f9团块11975135 11058259 148211988 1 50636f931180a32764edadd854968a971a083f8a 549eb0c73776fd0ede27a2fcb03366f76f45a13c团块9136086 8166649 166451273 5bc0a0f04a7004bc16cfab1c091c6b369fb74049团块9072616 8270262 80951514 741480238a6a6ce612cf089245dd46d6890fba9f团块8858569 8080252 101294029 744226651c55b14c1aa8affb78fba4fdf02b577c团块7412220 6766404 186825167

这就是我被困住的地方.我可以git show看到这些blob并看到它们看起来非常像jar文件,但我无法弄清楚为什么它们仍然在回购中.

查找文件名的各种尝试都失败了.

git repack -a,git repack -adgit repack -Ad一切似乎都没有影响.

git git-rewrite-history

5
推荐指数
2
解决办法
8320
查看次数

为什么我的.git文件很大?

我不小心在git目录中添加并提交了一些非常大的(100MB +)PSD文件.我们在目录中对这些文件进行了大量编辑,但后来意识到它们不应该存在并从目录中删除它们.

然后我跑了:

git add --all && git commit -m "Removed large psds"
Run Code Online (Sandbox Code Playgroud)

我的目录中的文件现在加起来不到十几MB,但.git文件本身除外,这是700MB +.

这里发生了什么?它是否保留已删除的.PSD文件的旧版本?这是否意味着git不会清除从删除文件中获得的空间?我如何完全忘记这些文件,以便我可以将.git文件大小调低?

git git-rewrite-history

5
推荐指数
1
解决办法
5048
查看次数

合并提交时如何避免rebase地狱?

我的git树中有以下情况:

1 -- 2 -- 3 -- 4 <-- master
      \         \
       5 -- 6 -- 7 -- 8 -- 9 <-- feature
Run Code Online (Sandbox Code Playgroud)

我想从功能中重新定义和压缩所有东西,这样我就可以通过添加功能的单个提交来提升master.

由于提交7已经是解决所有冲突的合并,我尝试了以下方法:

git rebase -i -p master
Run Code Online (Sandbox Code Playgroud)

我在这里给出的唯一选择是提交7,8和9."有道理",我想,"因为合并已经包括5和6,所以它们可以被丢弃".我继续在一次提交中压缩7,8和9,我们称之为"789".(我知道,我是创意类型.)

在此之后,我的树看起来像这样:

1 -- 2 -- 3 -- 4 <-- master
                \
                 5 -- 6 -- 789 <-- feature
Run Code Online (Sandbox Code Playgroud)

同一分支中5和6的存在使我感到困惑,但同样,因为它们已经包含在7中(现在是789),我可以放弃它们.

所以我git rebase -i master又一次,这次我丢弃了5和6.

然而,冲突在这里和那里出现,所以我放弃了整个事情.

我目前处于该阶段,但我的远程分支尚未更新,因此我可以重置为原始状态.

在没有手动解决所有合并冲突的情况下,哪些是正确的步骤,这将使我想到的地方?

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

5
推荐指数
2
解决办法
2337
查看次数

使用bfg repo-cleaner后需要克隆repo还是拉上现有的?

阅读bfg repo-cleaner的说明,工作流程如下:

  1. 使用--mirror选项克隆repo
  2. 使用bfg从不需要的项目中删除回购
  3. 使用git gc物理删除项目
  4. 推动清洁的回购

但是,我不清楚你是否需要删除自己的工作目录副本并进行新的克隆,或者你是否只需要拉动来获得干净的回购/历史记录?目前我是唯一一个使用回购的人.

git-rewrite-history bfg-repo-cleaner

5
推荐指数
1
解决办法
580
查看次数

如何按文件分割每个提交?

我知道如何手动拆分提交使用git rebase -i,但是如何自动拆分文件中的每个提交?

例如,提交A修改的3个文件,f1,f2和f3.分裂后,有3个提交A-f1,A-f2和A-f3.

我想这样做是为了使重写更容易,因为我只需要压缩一些小的提交.

git git-rebase git-rewrite-history

5
推荐指数
1
解决办法
812
查看次数

BFG回购清洁剂–替代新鲜克隆

我本打算在存储库中问这个问题,但是SO似乎是一个更合适的问这个问题的地方。

我能够使用BFG Repo Cleaner(很棒的工具,谢谢!)将我们的.git文件夹大小减少了1GB以上,就我们的存储库而言,这是一个巨大的成功。我还没有将裸露的克隆推到远程,因为我担心在了解推入然后不重新克隆的后果之前提出这些更改。

我了解最佳实践指示,当历史以这种方式改变时,最佳解决方案是执行新克隆。但是,我与一支由50多人组成的团队合作,在超过2GB的存储空间和23k的提交中,在我们的架构下,跨团队的协调非常困难。结果,我有一些问题:

  1. 如果我要推送这些更改的引用,而人们将继续使用现有副本而不是创建新的克隆,后果将是什么?
  2. 如果可行,他们是否需要采取其他措施来减轻这些后果,作为其影响的一部分?
  3. 如果您认为删除的斑点来自历史至少一年且最多三年的历史记录,此建议是否会根本改变?
  4. 最后,鉴于新克隆不包括任何未在上游同步的工作,您是否建议将未跟踪分支从一个克隆转移到另一个的最佳方法?如果已经存在执行此操作的Git命令,那么我很想听听您的见解。

再次感谢您创建了这样一个方便的工具,希望我能完成对我的团队项目有用的工作。在此期间,我将继续尝试使用叉子。

git-rewrite-history bfg-repo-cleaner

5
推荐指数
1
解决办法
761
查看次数