git - 如何备份 StGit 工作区?

标签 git

我经常通过将 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 clonestg clone 似乎都不起作用:如果我在克隆后键入 stg series,它会告诉我 stg series: master:分支未初始化

四处寻找,我发现 stgit 创建了一个 master.git 分支和其他几个临时(??)分支来存储元数据。似乎应该可以进行设置,以便将所有这些分支推送到备份存储库,但我不确定如何去做。

更新 [12/15/2011]:查看我想在 qgit 中备份的 stgit 管理的存储库,我看到它看起来像这样:

enter image description here

我尝试了 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 分支,但不会推送其他一些必需的元数据:

enter image description here

从上面的屏幕截图中,您可以看到原始仓库中有一个顶级 patches 文件夹和一个 refs/patches 文件夹,但在备份。这一切让我相信我找错人了。 没有使用标准 git 命令备份 StGit 元数据的方法吗?如果没有,在发生 rebase 失败或硬盘驱动器故障的情况下,备份我在复杂补丁系列上正在进行的工作的最佳方法是什么?

最佳答案

似乎尝试通过克隆来备份 StGit 工作区会适得其反。我已经确定了一个更简单的方法,该方法依赖于 stg exportstg 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/

相关文章:

java - 如何从 Git VCS 中的索引中删除文件?

git - 在 git 中单独 merge 提交的目的是什么?

git - 通过 GIT 将 Orchard.Source 部署到 Azure

xcode - 移动到不同的 Mac 时,Git 子模块文件在 XCode 中显示为红色

Git Pull 与 Git Rebase

git - 我不小心创建了一个名为 origin/foo 的本地分支。怎么办?

GIT 使用 gitcherry 和 format 显示 master 中缺少的分支的所有提交

git - 你如何 git fetch 然后 merge ? "Error: Your local changes to the following files would be overwritten by merge"

git - 尝试在 Ubuntu Lucid 10.04 LTS 中安装 git

Git 将远程分支获取到新的本地分支(使用一个命令)