我遇到了与此处提出的问题相同的问题:根目录中的新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) 采取以下案例:
我在主题分支中有一些工作,现在我已准备好合并回主人:
* 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中做了一系列提交,现在我意识到我忘记了正确设置我的用户名和用户邮件属性(新机器).我还没有将这些提交推送到我的存储库,所以在我这样做之前如何更正这些提交(只有主分支上的3个最新提交)?
我一直在看git reset和git commit -C <id> --reset-author,但我不认为我是在正确的轨道上.
我做了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 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中的提交历史中清除一个巨大的文件?
我做了一件蠢事.想象一下,我提交了一个100MB的文件.然后我看到这个并删除此文件并再次提交.这是删除文件的正常过程.
但现在副作用是我的历史很重,因为它保存了这个大文件(我相信这就是为什么它很重).我只使用本地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 :(
解决方案:这是摆脱文件的最短路径:
refs/remotes/origin/master一个远程存储库的行,删除它,否则git将不会删除这些文件git verify-pack -v .git/objects/pack/#{pack-name}.idx | sort …我正在使用以下来源从我的存储库中删除一些大型文件和目录:
http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/
git filter-branch 似乎只能在当前分支上工作 - 是否有办法立即将其应用于所有分支?
我发现BFG比原来的git-filter-branch快得多.
我们有多个svn repo移动到更多的git存储库,这意味着一些存储库文件夹合并和拆分.在此过程中,我需要删除一组根文件夹,我想将其删除到整个历史记录中.
我试图使用BFG --delete文件夹,它适用于单个文件夹,但我没有找到删除多个文件夹的方法.它甚至可能吗?或者我应该循环调用BFG多次,因为我要删除文件夹?
谢谢你的帮助.
我一直使用基于接口的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