标签: git-rewrite-history

filter-branch --tree-filter之后从git repo中删除refs/original/heads/master?

我遇到了与此处提出的问题相同的问题:根目录中的新git存储库包含子目录中的存在存储库

我在这里听到了这个答案:根目录中的新git存储库包含子目录中的存在存储库

现在,gitk --all显示两个历史:一个在当前达到高潮master,一个命名original/refs/heads/master.

我不知道这第二个历史是什么,或者如何从回购中删除它.我的存储库中不需要两个历史记录.

我怎么摆脱它?

重现自己:

mkdir -p project-root/path/to/module
cd project-root/path/to/module
mkdir dir1 dir2 dir3 
for dir in * ; do touch $dir/source-file-$dir.py ; done
git init
git add .
git commit -m 'Initial commit'
Run Code Online (Sandbox Code Playgroud)

现在我们有原始海报的问题.让我们使用上面链接的答案将git repo的根目录移动到project-root:

git filter-branch --tree-filter 'mkdir -p path/to/module ; git mv dir1 dir2 dir3 path/to/module' HEAD
rm -rf path
cd ../../../ # Now PWD is project-root
mv path/to/module/.git .
git reset --hard
Run Code Online (Sandbox Code Playgroud)

现在,看看我目前的问题:

gitk …
Run Code Online (Sandbox Code Playgroud)

git git-rewrite-history git-plumbing

166
推荐指数
3
解决办法
4万
查看次数

重新绑定Git合并提交

采取以下案例:

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

* eb3b733 3     [master] [origin/master]
| * b62cae6 2   [topic]
|/  
* 38abeae 1
Run Code Online (Sandbox Code Playgroud)

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

*   8101fe3 Merge branch 'topic'  [master]
|\  
| * b62cae6 2                     [topic]
* | eb3b733 3                     [origin/master]
|/  
* 38abeae 1
Run Code Online (Sandbox Code Playgroud)

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

*   8101fe3 Merge branch 'topic'  [master]
|\  
| * b62cae6 2                     [topic]
| | * e7affba 4                   [origin/master]
| |/  
|/|   
* | eb3b733 3
|/  
* 38abeae 1
Run Code Online (Sandbox Code Playgroud)

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

* d4de423 2       [master]
* e7affba 4       [origin/master]
* …
Run Code Online (Sandbox Code Playgroud)

git merge rebase git-rebase git-rewrite-history

163
推荐指数
3
解决办法
8万
查看次数

如何修改Git中的几个提交来改变作者

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

我一直在看git resetgit commit -C <id> --reset-author,但我不认为我是在正确的轨道上.

git git-commit git-rewrite-history

153
推荐指数
5
解决办法
4万
查看次数

如何修改旧的Git提交?

我做了3个git提交,但没有被推送.如何修改不是最新的旧版本(ddc6859af44)和(47175e84c)?

$git log
commit f4074f289b8a49250b15a4f25ca4b46017454781
Date:   Tue Jan 10 10:57:27 2012 -0800

commit ddc6859af448b8fd2e86dd0437c47b6014380a7f
Date:   Mon Jan 9 16:29:30 2012 -0800

commit 47175e84c2cb7e47520f7dde824718eae3624550
Date:   Mon Jan 9 13:13:22 2012 -0800
Run Code Online (Sandbox Code Playgroud)

git version-control git-rewrite-history

148
推荐指数
5
解决办法
10万
查看次数

从Git repo清除文件失败,无法创建新备份

我尝试通过运行以下命令从远程仓库中删除文件:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD
Run Code Online (Sandbox Code Playgroud)

但是Git抱怨说

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

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

我该如何删除该文件?这是一个29Mb的文件,坐在我的仓库,所以我非常需要删除该文件.

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

git git-filter-branch git-commit git-rewrite-history

104
推荐指数
3
解决办法
4万
查看次数

如何删除git中错误提交的大文件

可能重复:
如何从Git中的提交历史中清除一个巨大的文件?

我做了一件蠢事.想象一下,我提交了一个100MB的文件.然后我看到这个并删除此文件并再次提交.这是删除文件的正常过程.

但现在副作用是我的历史很重,因为它保存了这个大文件(我相信这就是为什么它很重).我只使用本地git,所以我不在任何服务器同步.

如何最终删除此文件并节省磁盘空间?

git git-rewrite-history

82
推荐指数
3
解决办法
5万
查看次数

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

(解决了,看到问题正文的底部)现在
寻找这个,我现在拥有的是:

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

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_name'
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc
Run Code Online (Sandbox Code Playgroud)

包中还有文件,这就是我所知道的:

git verify-pack -v .git/objects/pack/pack-3f8c0...bb.idx | sort -k 3 -n | tail -3
Run Code Online (Sandbox Code Playgroud)

还有这个:

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch file_name" HEAD
rm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --prune
Run Code Online (Sandbox Code Playgroud)

相同...

尝试过的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 …

git version-control git-rewrite-history

76
推荐指数
4
解决办法
3万
查看次数

git,所有分支上的filter-branch

我正在使用以下来源从我的存储库中删除一些大型文件和目录:

http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/

为什么我的git存储库这么大?

git filter-branch 似乎只能在当前分支上工作 - 是否有办法立即将其应用于所有分支?

git git-filter-branch git-rewrite-history

50
推荐指数
3
解决办法
2万
查看次数

BFG删除多个文件夹

我发现BFG比原来的git-filter-branch快得多.

我们有多个svn repo移动到更多的git存储库,这意味着一些存储库文件夹合并和拆分.在此过程中,我需要删除一组根文件夹,我想将其删除到整个历史记录中.

我试图使用BFG --delete文件夹,它适用于单个文件夹,但我没有找到删除多个文件夹的方法.它甚至可能吗?或者我应该循环调用BFG多次,因为我要删除文件夹?

谢谢你的帮助.

git-rewrite-history bfg-repo-cleaner

37
推荐指数
1
解决办法
8318
查看次数

如何替换git历史文件中的文本?

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

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

git filter-branch --tree-filter 'git ls-files -z "*.php" |xargs -0 perl -p -i -e "s#(PASSWORD1|PASSWORD2|PASSWORD3)#xXxXxXxXxXx#g"' -- --all
Run Code Online (Sandbox Code Playgroud)

我试过这个,不幸的是注意到密码确实发生了变化,所有二进制文件都被破坏了.图像等都会被破坏.

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

谢谢.

编辑:

我搞砸了什么.导致二进制文件损坏的实际代码是:

$ git filter-branch --tree-filter "find . -type f -exec sed -i -e 's/originalpassword/newpassword/g' {} \;"
Run Code Online (Sandbox Code Playgroud)

顶部的代码实际上使用我的密码奇怪地删除了所有文件.

git version-control substitution git-filter-branch git-rewrite-history

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