标签: git-rewrite-history

自动重写完整的git历史记录以摆脱简单的合并提交

我们的团队使用纯粹基于合并的git工作流程,我们正在讨论是否可能要求所有团队成员在一个下午将所有工作推送到服务器并进行一个重新定位服务器仓库的晚上.

我(想)我想自动做的是,只要所有提交只在同一组分支上并且并行提交的数量低于给定的阈值,我想重新定义系列并删除合并提交(S).但我愿意接受建议吗?

有人知道怎么做吗 ?

git git-rewrite-history

9
推荐指数
2
解决办法
1370
查看次数

Git存储库太大了

我有一个项目,其中包含大约12MB的代码和资产.我一直在使用Git跟踪它,只是注意到我的.git文件夹现在刚刚超过1.83GB.它由几个小文件组成,然后只有一个包文件,占文件夹的1.82GB左右.

我已经运行git gc --aggressivegit gc --prune.它的大小相同.我试过了:

git reflog expire --expire=now --all
git repack -ad  # Remove dangling objects from packfiles
git prune       # Remove dangling loose objects
Run Code Online (Sandbox Code Playgroud)

但它仍然是相同的大小.我甚至克隆了它(曾经在本地进行了强制重新包装,并再次从Git获得),但每个仍然是1.83GB.这是正常的吗?有没有办法减少它的大小,或者我只是开始一个新的仓库,复制代码,并接受我的过去的提交将会消失?

git github ruby-on-rails-3 git-rewrite-history

9
推荐指数
1
解决办法
2048
查看次数

从git repo和提交历史中递归删除所有二进制文件

我从git commit history中删除了大量二进制文件的几个 不同的 线程,但我的问题有点不同.因此,我在这里要了解并确认步骤 -

我的git回购是~/foo.我想从repo中的一个目录中删除所有*.jpg,*.png,*.mp4,*.ogv(等等),特别是从~/foo/public/data.

步骤1.删除文件

~/foo/data > find -E . -regex ".*\.(jpg|png|mp4|m4v|ogv|webm)" \
    -exec git filter-branch --force --index-filter \
    'git rm --cached --ignore-unmatch {}' \
    --prune-empty --tag-name-filter cat -- --all \;
Run Code Online (Sandbox Code Playgroud)

步骤2.将二进制文件扩展名添加到.gitignore并提交.gitignore

~/foo/data > cd ..
~/foo > git add .gitignore
~/foo > git commit -m "added binary files to .gitignore"
Run Code Online (Sandbox Code Playgroud)

第3步.推动一切

~/foo > git push origin master --force
Run Code Online (Sandbox Code Playgroud)

我在正确的轨道上面吗?我想在切割一次之前测量两次,所以说.

更新:嗯,上面给我的错误

You need to run this command from the toplevel …
Run Code Online (Sandbox Code Playgroud)

git git-rewrite-history

9
推荐指数
1
解决办法
6152
查看次数

删除git filter-branch中的大量文件

我正在将存储库从svn迁移到git.

在最后一步中,我想从历史记录中删除大量不需要的文件.

我正在尝试以下命令:

git filter-branch --prune-empty --index-filter \
  "for file in $(cat files); do git rm -rf --cached --ignore-unmatch ${file}; done" -f
Run Code Online (Sandbox Code Playgroud)

但它说参数列表太长了.

我可以像这样重写:

for file in $(cat files); do
  git filter-branch --prune-empty --index-filter \
    "git rm -rf --cached --ignore-unmatch ${file}" -f
done
Run Code Online (Sandbox Code Playgroud)

但它会经历过多次过滤分支,历史很长......所以,这需要花费太多时间.

有没有更快的方法来过滤分支删除大量文件?

git git-filter-branch git-rewrite-history

9
推荐指数
1
解决办法
1819
查看次数

如何通过非交互式压缩除最近的提交之外的所有提交来减少膨胀的Git仓库的大小?

我的Git repo有数百GB的数据,比如SQL备份,所以我试图删除旧的,过时的提交,因为它们会使一切变得越来越大.我需要一个快速的解决方案; 越快越好.

除了最新的提交之外,我如何压缩所有提交,而不必在交互式rebase中手动压缩每个提交?具体来说,我不想使用

git rebase -i --root
Run Code Online (Sandbox Code Playgroud)

我的回购

我有这些提交:

A .. B .. C ... ... H .. I .. J .. K .. L
Run Code Online (Sandbox Code Playgroud)

我想是这样的(在两者之间挤压的一切A,并H进入A):

A .. H .. I .. J .. K .. L
Run Code Online (Sandbox Code Playgroud)

有关如何压缩所有提交的答案,但我想保留一些最近的提交.我也不想压缩最近的提交.(特别是我需要保持前两个提交从顶部开始计数.)

git rebase git-rebase git-rewrite-history

8
推荐指数
1
解决办法
2888
查看次数

删除不在子树中或原始存储库中的提交

我实际上有两个存储库:

  • main
  • external

main仓库是一段时间后,将合并后external/main的目录(如子树).现在我想将所做的更改迁移external/mainmain存储库,但只有这些提交而没有其他无关的提交external/<anything-else>.

我实际上尝试过经典:

git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter main -- --all
Run Code Online (Sandbox Code Playgroud)

但是这也删除了对初始main存储库所做的所有提交,只留下了在externalgit存储库中创建的提交.


那么:如何只保留提交:

a)制作初始main存储库

b)制作external(external/main)的子树


当我尝试时git pull -s subtree ../external,提交都被合并,包括在子树中没有改变任何内容的提交.我想只有实际改变子树中某些内容的提交,并且还只有来自子树的文件信息.

git git-filter-branch git-subtree git-rewrite-history

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

git filter-branch 从我的存储库中删除所有子模块

你好,我已经成功重写了历史记录,并获得了我想要提取的 5 个文件夹git filter-branch -f --prune-empty --tree-filter 'rm -rf <all unwanted dirs>',并保留了所有 git 历史记录。

唯一剩下的问题是子模块,我仍然有提交

Subproject commit <hash>

我想从我的 git 历史记录中完全删除所有这些子模块提交,我该如何实现这一点?

git github revision-history git-rewrite-history

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

无效BFG使用后Git合并重复

我已经被整个存储库深深地淹没了(仅由我使用)并且可以使用一些帮助来整理它.

这就是我做的.我意识到在我的提交历史中,有一些文件包含我不想放置的凭据.因此,我决定合法并尝试使用BFG Repo-Cleaner来解决这些问题.我把所有凭据都放在.gitignores中,然后继续试图将它们从历史中删除.根据文档说明,我执行了以下命令:

git clone --mirror myrepo.git
java -jar bfg.jar --delete-files stuffthatshouldbedeleted.txt  myrepo.git
Run Code Online (Sandbox Code Playgroud)

此时,BFG告诉我已经找到并删除了x个文件.甜.

cd myrepo.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive
git push
Run Code Online (Sandbox Code Playgroud)

根据终端日志,它更新了回购.到目前为止一切都那么好吧?我弹出我的github帐户,点击几下后,在我的历史记录中找到仍然存在的凭据,文件和所有凭据.我回去尝试相同的命令集,但使用此行而不是文件移除器:

java -jar bfg.jar --replace-text passwords.txt  myrepo.git
Run Code Online (Sandbox Code Playgroud)

其中passwords.txt是一个包含我想要的所有凭据的字符串实例的文件.同样,BFG日志表明它已经修复了几个实例.我推了推,检查,凭证仍在那里,坐在Github.我注意到我所有提交的SHA-1密钥都被更改了,所以假设BFG做了一些事情,而不是我想要它做的事情.

在这一点上,我放弃并尝试重新开始工作,我想稍后会解决这个问题.我做了一些工作,试图推高,得到一个奇怪的合并冲突(你提前50,提交50后).什么?我尝试拉动和合并,突然之间,我的git历史中的每个提交都在名称中重复,其中一些只是空白.我查看了我的Github网络图,看起来有一个第二个分支从我的初始提交开始,它完全反映了我在上一次提交时已经拉链的所有提交(我从未分支,只是线性地匆匆忙忙).

我无法恢复到先前的提交,因为它们都是按时间顺序重复的.我的凭据仍在那里,现在的实例数是原来的两倍,而且我的历史翻了一倍,并且试图理解这一点非常困惑.当我尝试从现在开始运行BFG,克隆并重新镜像repo时,它告诉我它没有凭据,尽管我可以在Github中看到它们.我真的可以帮助理解发生了什么,以及如何,如果有的话,我可以再次回到状态.

我正在考虑删除整个回购并重新开始.我真的不想那样做.

tldr; 尝试使用BFG,在我的仓库中以某种方式复制了所有提交的半成品版本,无法解开,并且加重了伤害,BFG什么也没做,并声称它完成了它的工作.

git merge github git-rewrite-history bfg-repo-cleaner

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

GitHub礼仪:如何使收到的GitHub PR更改历史记录ff-mergeable?

用户在GitHub上的存储库中创建了一个带有单个提交的PR.

自PR以来,更改被推送到主存储库,因此合并无法快速进行.

TL; DR

我拉了他的分支,重新设置了几次并推送到原点,所以PR提交现在有一个不同的哈希值,并且GitHub PR没有自动标记为拉入.

长(呃)版

我正在研究一个主题分支并取得他的主人.

* 5977cb4 - (user/master) PR <user>
| * 857775e - (HEAD -> topic) topic commeit. <me>
| | * 871201e - (master) Local changes in master <me>
| |/  
| * f648f4e - (origin/master) Changes in origin <me>
|/  
* 3461bd2 - Initial commit <me>
Run Code Online (Sandbox Code Playgroud)

然后重新考虑他的主要分支

?  local git:(topic) git rebase user/master
First, rewinding head to replay your work on top of it...
Applying: Changes in origin
Applying: topic commeit.

* 1e2fe2e …
Run Code Online (Sandbox Code Playgroud)

git etiquette github pull-request git-rewrite-history

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

从所有git历史记录中删除文件

基于这篇文章,我创建了一个小脚本,它应该删除整个git仓库中所有出现的文件,所有分支,标签和提交.剧本:

#!/usr/bin/env node
var child_process = require('child_process');
if (process.argv.length < 3){
  console.error('USAGE: git-forget path/to/file')
  process.exit(1);
}
var path = process.argv[2];

var phase = 0;
function printLog(error, stdout, stderr) {
  if (error) {
    console.error('ERROR' + error);
  }
  console.log(++phase);
  console.log(stdout);
}

child_process.execSync('git filter-branch --force --index-filter \'git rm -f --cached --ignore-unmatch  '+ path +'\' --prune-empty --tag-name-filter cat -- --all');
child_process.execSync('echo "' + path + '" >> .gitignore', printLog);
child_process.execSync('git add .gitignore');
child_process.execSync('git commit -m "Add ' + path +' to .gitignore"',printLog) …
Run Code Online (Sandbox Code Playgroud)

git node.js git-rewrite-history

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