标题看起来有点奇怪,所以先介绍一下背景:
我有几个本地 git 存储库,并且发现自己想要进行备份。我想到了两种方法,git bundle
并且tar
(知道还有很多其他方法,但我想要一些“简单”的方法,这将使存储库打包在“单个文件”中)
- 使用焦油
我尝试的命令是
tar cvf gitrepo.tar gitrepo/
现在,乍一看这是可行的,但是如果我将其提取到某个地方,就会出现一些奇怪的情况,例如:
git config(.git/config 中的配置)似乎与 tar 中的配置不同,而是一个“旧”版本。例如:如果我编辑配置并将其压缩,然后提取它,则无论出于何种原因,配置都不会具有最新的更改......
除此之外,其他一切似乎都有效,尽管我没有检查 .git 文件夹中的其他文件是否与配置文件有类似的奇怪之处。
- 使用 git 捆绑包
我尝试的两个命令是:
git bundle create repo.bundle
和
git bundle create repo.bundle --all
第一个命令乍一看有效,但后来我注意到它没有所有分支,因为我没有使用该--all
标志。
第二个命令乍一看(再次)有效,但是,如果我 git clone 所说的包,它最终不包含所有文件在非捆绑/原始本地仓库中提交的...
我认为“丢失的文件”在 .git 中,所以我在那里寻找最大的文件,并在 .git/objects/pack 中找到了一个...所以我使用以下命令将其解压:
cd "$@"/.git/objects/pack ; mkdir ~/SAMPLE; mv *.pack ~/SAMPLE; git unpack-objects < ~/SAMPLE/*.pack; rm -rf ~/SAMPLE
$@
是从 git 包克隆的本地存储库的名称。我没有解决上述问题,但我确实注意到一些提交历史记录已恢复,尽管原始存储库中仍然缺少文件。
所以我很困惑如何正确备份我的本地 git 存储库(最好在单个文件中),同时仍然保留文件的最新更改并且不丢失文件? (如所有提交历史记录、分支等)
答案1
如果我在提取 tar 之前移动 tar,那么 tar 似乎会按预期工作:
mv gitrepo.tar otherdir/
cd otherdir ; tar xvf gitrepo.tar
作为替代方案,zip 似乎可以正常工作,而无需先移动存档:
zip -Zs -r -FS gitrepo.zip gitrepo/
上面的代码没有压缩就进行了 zip 压缩。