我经常通过将 git 存储库嵌套在 Subversion、Perforce 或 CVS 沙箱中来使用 git 'guerrilla-style'。当我以这种方式工作时,我喜欢在 USB 内存棒上创建一个“远程”存储库,以便我有一个备份,以防我的硬盘驱动器死机:
$ git --bare init /f/projects/myproj.git
$ git remote add origin /f/projects/myproj.git
$ git push -u origin master
然后我只需要记住时不时地输入 git push
来备份我的工作。如果我的存储库被清理,我可以通过以下方式取回它:
$ git clone /f/projects/myproj.git
最近,我一直在使用 StGit 针对上游 Perforce 存储库维护一堆补丁。在这种情况下,我的简单备份策略不再有效。 git clone
或 stg clone
似乎都不起作用:如果我在克隆后键入 stg series
,它会告诉我 stg series: master:分支未初始化
。
四处寻找,我发现 stgit 创建了一个 master.git
分支和其他几个临时(??)分支来存储元数据。似乎应该可以进行设置,以便将所有这些分支推送到备份存储库,但我不确定如何去做。
更新 [12/15/2011]:查看我想在 qgit 中备份的 stgit 管理的存储库,我看到它看起来像这样:
我尝试了 Jefromi 关于使用 push --all
的建议:
$ git --bare init luasand_stg_bak
Initialized empty Git repository in c:/d/projects/luasand_stg_bak/
$ cd luasand_stg
$ git remote add backup ../luasand_stg_bak
$ git push -u --all backup
Counting objects: 369, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (364/364), done.
Writing objects: 100% (369/369), 467.79 KiB, done.
Total 369 (delta 73), reused 0 (delta 0)
To ../luasand_stg_bak
* [new branch] master -> master
* [new branch] master.stgit -> master.stgit
Branch master set up to track remote branch master from backup.
Branch master.stgit set up to track remote branch master.stgit from backup.
这会推送 master.stgit
分支,但不会推送其他一些必需的元数据:
从上面的屏幕截图中,您可以看到原始仓库中有一个顶级 patches
文件夹和一个 refs/patches
文件夹,但在备份。这一切让我相信我找错人了。 没有使用标准 git 命令备份 StGit 元数据的方法吗?如果没有,在发生 rebase 失败或硬盘驱动器故障的情况下,备份我在复杂补丁系列上正在进行的工作的最佳方法是什么?
最佳答案
似乎尝试通过克隆来备份 StGit 工作区会适得其反。我已经确定了一个更简单的方法,该方法依赖于 stg export
和 stg import
。它是这样工作的:
$ pwd
/c/d/projects/luasand_stg
$ stg push -a
$ stg series
+ add-copyright-notice
+ add-bn-namespace
> fix-tabs
$ stg export --dir=/f/projects/luasand_stg_patches
Checking for changes in the working directory ... done
$ cd ..
# Pretend STG sandbox got borked
$ rm -rf luasand_stg
# Re-clone it from the original repo
$ stg clone luasand luasand_stg
Cloning into luasand_stg...
done.
$ cd luasand_stg
# No patches? No problem, just reimport them from the backup
$ stg series
$ stg import -s /f/projects/luasand_stg_patches/series
Checking for changes in the working directory ... done
Importing patch "add-copyright-notice" ... done
Importing patch "add-bn-namespace" ... done
Importing patch "fix-tabs" ... done
Now at patch "fix-tabs"
# Everything restored
$ stg series
+ add-copyright-notice
+ add-bn-namespace
> fix-tabs
因此,我没有尝试备份整个存储库,而是将每个单独的补丁备份到我的 USB 内存棒上的 /f/projects/luasand_stg_patches
。这意味着我必须确保源代码库 luasand
也已在某处备份,因此我可以通过使用 stg clone<(重新)克隆它来重新创建我的工作区的状态
并重新导入我的补丁。
我不喜欢这个工作流程,但至少我可以理解它。我会等一会儿再接受这个答案,看看是否有人可以提供更简单的解决方案......
关于git - 如何备份 StGit 工作区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8513765/