如何在单个文件中以正确的方式备份本地 git 存储库?

如何在单个文件中以正确的方式备份本地 git 存储库?

标题看起来有点奇怪,所以先介绍一下背景:

我有几个本地 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 压缩。

相关内容