将git存储库转换为浅?

Rob*_*ert 49 git

如何将已克隆的git存储库转换为浅存储库?

git存储库是通过我控制之外的脚本下载的,因此我无法进行浅层克隆.

这样做的原因是为了节省磁盘空间.(是的,我真的很缺乏磁盘空间,所以即使浅存储库存储不多,也需要它.)

我已经试过了

git repack -a -d -f -depth=1
Run Code Online (Sandbox Code Playgroud)

但这实际上使存储库更大.

fuz*_*Tew 43

这对我有用:

git pull --depth 1
git gc --prune=all
Run Code Online (Sandbox Code Playgroud)

  • 我运行了上面的命令.repo现在确实很浅(`git log`只显示一个提交,`git branch`只显示一个分支).但`.git`文件夹仍然占用2.5 GB.用`--depth 1`克隆的同一个repo占用大约1 GB.有关如何减少磁盘使用量的任何建议? (9认同)
  • 我发现上述命令还不够,我还必须这样做:按照 /sf/ask/2672032961/ 中的建议`git reflog expire --expire=all --all` -reduce-the-depth-of-an-existing-git-clone 另外,还需要上面的 git tag 命令。 (5认同)
  • @Dzmitry,我已经更新了答案中的命令,将 `--prune=all` 添加到垃圾收集中。这立即为我删除了多余的对象。 (2认同)
  • 从我的实验中,`git pull --depth = 1`保留了非HEAD标签,`git gc --prune = all`并没有将其删除。我不得不使用`git tag -d $(git tag -l)`来正确地垃圾收集那些引用。 (2认同)
  • `--prune=all` 应该是 `--prune=now`,请参阅:https://www.spinics.net/lists/git/msg354409.html (2认同)

use*_*328 12

你可以沿着这条线将git repo转换为一个浅的:

git show-ref -s HEAD > .git/shallow
git reflog expire --expire=0
git prune
git prune-packed
Run Code Online (Sandbox Code Playgroud)

确保进行备份,因为这是破坏性操作,同时请记住,不支持克隆或从浅回购获取!要真正删除所有历史记录,您还需要在修剪之前删除对先前提交的所有引用.

  • 实际上这似乎没有做任何事情. (5认同)
  • 要删除所有引用,请将--all添加到reflog命令:git reflog expire --expire = now --all (2认同)
  • 注意`git prune`已经执行`git prune-packed`。还要注意,如果要存储所有分支,则必须在.git / shallow中列出所有分支的提示。这个命令对我有用,但是我不知道它是否会一直起作用:`find .git / refs -type f | xargs猫| 排序-u> .git / shallow` (2认同)

Sam*_*rks 9

结合 @fuzzyTew 的答案和对该答案的评论:

git pull --depth 1
git tag -d $(git tag -l)
git reflog expire --expire=all --all
git gc --prune=all
Run Code Online (Sandbox Code Playgroud)

想要通过在整个磁盘上运行它来节省空间吗?- 然后运行这个fd命令:

fd -HIFt d '.git' -x bash -c 'pushd "$0" && ( git pull --depth 1; git tag -d $(git tag -l); git reflog expire --expire=all --all; git gc --prune=all ) && popd' {//}
Run Code Online (Sandbox Code Playgroud)

或者只是常规的find

find -type d -name '.git' -exec bash -c 'pushd "${0%/*}" && ( git pull --depth 1; git tag -d $(git tag -l); git reflog expire --expire=all --all; git gc --prune=all ) && popd' {} \;
Run Code Online (Sandbox Code Playgroud)


Vas*_*kov 7

创建本地存储库的浅克隆:

git clone --depth 1 file:///full/path/to/original/dir destination
Run Code Online (Sandbox Code Playgroud)

请注意,第一个“地址”应该是 a file://,这很重要。此外,git 将假定您的原始本地 file:// 地址是“远程”(“来源”),因此您需要更新新存储库,指定正确的git remote.


Pop*_*lin 5

自特定日期以来转换为浅:

git pull --shallow-since=YYYY-mm-dd
git gc --prune=all
Run Code Online (Sandbox Code Playgroud)

也有效:

git fetch --shallow-since=YYYY-mm-dd
git gc --prune=all
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!对我来说 `git fetch --深度 1; git gc --aggressive --prune=all` 也有效。这样做似乎相当于使用以下命令进行浅层克隆:“git clone --深度1” (2认同)