如何备份StGit工作区?

时间:2011-12-15 00:46:15

标签: git

我经常通过在Subversion,Perforce或CVS沙箱中嵌套git repo来使用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: branch not initialized

围绕一些人,我已经看到stgit创建了一个master.git分支和几个其他临时(??)分支来存储元数据。似乎应该可以设置所有这些分支被推送到备份仓库,但我不知道如何去做。

更新 [12/15/2011]:看看我想在qgit中备份的stgit-managed repo,我看到它看起来像这样:

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元数据?如果没有,那么在一个复杂的补丁系列中备份我的工作的最佳方法是什么?如果出现僵硬的硬盘或硬盘驱动器故障?

2 个答案:

答案 0 :(得分:5)

似乎尝试通过克隆来备份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并重新导入来重新创建工作区域的状态我的补丁。

我不喜欢这个工作流程,但至少我可以理解它。我会等一段时间才接受这个答案,看看是否有人能提供更简单的解决方案......

答案 1 :(得分:2)

如果他们确实是所有分支(我相信他们是),你可以使用git push --all来推动所有分支。

如果还有其他引用(例如引用/补丁),那么还有git push --mirror,这将使远程存储库看起来与您的完全(即,这仅适用于精确的镜像,所以要小心)。

然而,顶层的额外补丁目录并不是Git所知道的,所以没有什么能够推动它。如果它的内容对StGit很重要,那么你最好的选择可能是回到rsync。它很聪明,不会重新复制,所以它不应该那么慢。

我还应该注意到StGit没有做任何你用Git做不到的事情。它只是隐藏了你的一些东西。您可以通过临时分支,存储和变基的组合来完成所有这些操作。如果你这样做,Git会意识到一切,push --mirror将会正常工作。