如何删除Git子模块?
顺便说一句,有什么理由我不能干脆做到
git submodule rm whatever吗?
我有一个Git存储库,其中包含许多子目录.现在我发现其中一个子目录与另一个子目录无关,应该分离到一个单独的存储库.
如何在将文件的历史记录保存在子目录中的同时执行此操作?
我想我可以制作一个克隆并删除每个克隆的不需要的部分,但我想这会给我一个完整的树,当检查旧版本等.这可能是可以接受的,但我宁愿能够假装两个存储库没有共享历史记录.
为了说清楚,我有以下结构:
XYZ/
.git/
XY1/
ABC/
XY2/
Run Code Online (Sandbox Code Playgroud)
但我想这样做:
XYZ/
.git/
XY1/
XY2/
ABC/
.git/
ABC/
Run Code Online (Sandbox Code Playgroud) 145M = .git/objects/pack /
我编写了一个脚本来添加每个提交和提交的差异大小,然后再从每个分支的尖端向后移动.我得到129MB,没有压缩,没有分支机构的相同文件和分支机构之间的共同历史记录.
Git考虑了所有这些因素,所以我期望更小的存储库.那么为什么.git这么大?
我弄完了:
git fsck --full
git gc --prune=today --aggressive
git repack
Run Code Online (Sandbox Code Playgroud)
要回答有多少文件/提交,我有19个分支,每个文件大约有40个文件.287次提交,发现使用:
git log --oneline --all|wc -l
Run Code Online (Sandbox Code Playgroud)
它不应该使用10兆字节来存储有关此信息.
我有一个GitHub仓库,有两个分支 - 主和发布.
发布分支包含二进制分发文件,这些文件导致了非常大的repo大小(> 250MB),所以我决定清理一下.
首先,我删除了远程发布分支 git push origin :release
然后我删除了本地发布分支.首先我试过git branch -d release,但是git说"错误:分支'释放'不是你当前HEAD的祖先." 这是真的,所以我git branch -D release强迫它被删除.
但是我在本地和GitHub上的存储库大小仍然很大.所以然后我浏览了通常的git命令列表,比如git gc --prune=today --aggressive没有运气.
按照Charles Bailey在SO 1029969的指示,我得到了最大blob的SHA1列表.然后我使用来自SO 460331的脚本 来找到blob ......并且五个最大的不存在,虽然找到了较小的blob,所以我知道脚本正在工作.
我认为这些博客是发布分支中的二进制文件,它们在删除该分支后不知何故.什么是摆脱它们的正确方法?
我目前的基数总大约是.200MB.
但我的.git文件夹有5GB(!)的惊人大小.因为我把我的工作推到外部服务器,我不需要任何大的本地历史......
如何缩小.git文件夹以释放笔记本上的一些空间?我可以删除超过30天的所有更改吗?
非常感谢任何帮助:)
我检查了一大堆文件到一个分支并合并,然后不得不删除它们,现在我留下了一个大的.pack文件,我不知道如何摆脱.
我删除了所有使用的文件git rm -rf xxxxxx,我也运行了该--cached选项.
有人能告诉我如何删除当前位于以下目录中的大型.pack文件:
.git/objects/pack/pack-xxxxxxxxxxxxxxxxx.pack
我只需要删除我仍然拥有但不再使用的分支吗?或者我还需要运行其他东西吗?
我不确定它有多大差别,但它显示了一个挂锁文件.
谢谢
编辑
以下是我的bash_history的一些摘录,它应该让我知道我是如何设法进入这种状态的(假设我正在开发一个名为'my-branch'的git分支,我有一个包含更多文件夹的文件夹/文件):
git add .
git commit -m "Adding my branch changes to master"
git checkout master
git merge my-branch
git rm -rf unwanted_folder/
rm -rf unwanted_folder/ (not sure why I ran this as well but I did)
Run Code Online (Sandbox Code Playgroud)
我以为我也运行了以下内容,但它没有出现在bash_history中与其他人:
git rm -rf --cached unwanted_folder/
Run Code Online (Sandbox Code Playgroud)
我还以为我运行了一些git命令(比如git gc)来尝试整理包文件,但它们也没有出现在.bash_history文件中.
我不小心添加,提交并推送了一个巨大的二进制文件,我最近提交了一个Git存储库.
如何让Git删除为该提交创建的对象,以便我的.git目录再次缩小到合理的大小?
编辑:谢谢你的回答; 我试过几个解决方案.没有用.例如,GitHub中的文件从历史记录中删除了文件,但.git目录大小没有减少:
$ BADFILES=$(find test_data -type f -exec echo -n "'{}' " \;)
$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $BADFILES" HEAD
Rewrite 14ed3f41474f0a2f624a440e5a106c2768edb67b (66/66)
rm 'test_data/images/001.jpg'
[...snip...]
rm 'test_data/images/281.jpg'
Ref 'refs/heads/master' was rewritten
$ git log -p # looks nice
$ rm -rf .git/refs/original/
$ git reflog expire --all
$ git gc --aggressive --prune
Counting objects: 625, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (598/598), done. …Run Code Online (Sandbox Code Playgroud) (解决了,看到问题正文的底部)现在
寻找这个,我现在拥有的是:
几乎相同的方法,但它们都将对象留在包文件中......坚持.
我尝试了什么:
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 …删除数百兆字节的意外生成的垃圾后,我的rails项目目录中的.git /对象仍然庞大.
我已经尝试过git add -A,以及其他命令来更新索引并删除不存在的文件.我收集,也许是错误的,目录中有两个字符名称的文件是blob.我曾尝试回滚以前的提交,但没有运气.
我该怎么做才能清理这个目录?