我的主目录位于文件服务器上的远程安装的NFS分区中,并且是常规备份的。我想让我的项目的git存储库位于我的主目录下(以便备份)但我希望我的工作树位于我的工作站的本地磁盘分区中(这样构建速度很快)。未备份本地磁盘分区。
关于如何做到这一点的任何想法?我知道我可以克隆NFS存储库并推送到它,但这似乎是不必要的过度杀伤。
是否可以像在本地分区中创建.git符号链接到远程NFS分区中的.git目录一样简单?
你可以创建你的Git仓库:
.git
dir使用--git-dir=<path>
或$GIT_DIR
环境变量指定,并引用您(备份)主目录中的路径。git init
命令考虑了$GIT_DIR
环境变量:
如果设置了
$GIT_DIR
环境变量,则它指定使用的路径而不是./.git
作为存储库的基础。
或者,您可以在家庭目录中创建您的仓库,但添加以下git config
:
core.worktree
设置工作树根目录的路径。 这可以通过
GIT_WORK_TREE
环境变量和--work-tree
命令行选项覆盖。 它可以是.git
目录的绝对路径或相对路径,由--git-dir
或GIT_DIR
指定,或自动发现。 如果指定了--git-dir
或GIT_DIR
但未指定--work-tree
,GIT_WORK_TREE
和core.worktree
,则当前工作目录将被视为工作树的根。请注意,即使在目录的“
.git
”子目录中的配置文件中设置此变量,并且其值与后一个目录不同(例如“/path/to/.git/config
”将core.worktree
设置为“/different/path
”),这个变量很有可能,这很可能是配置错误。 在“/path/to
”目录中运行git命令仍将使用“/different/path
”作为工作树的根目录,并且可能会对用户造成很大的混淆。
OP增加:
是否可以像在本地分区中创建.git符号链接到远程NFS分区中的.git目录一样简单?
至少,通过设置(如git-dir
或core.worktree
),可以实现相同的效果,而不依赖于特定于操作系统的功能,如符号链接(在每个操作系统上都不可用)
更新2018年(8年后):Tom Russell添加in the comments:
在初始化本地工作站(NFS客户端)上的存储库时,似乎
--separate-git-dir
标志现在用于指向NFS服务器上的.git/
。 但后续行为很奇怪:在NFS客户端上提交的更改不会自动传播到服务器,需要服务器上的git checkout -- <file>
。我后来发现在客户端仓库中提交后服务器仓库中的
git reset --hard
(反之亦然)是使工作目录更新的最简单方法。
像往常一样在您的主目录中创建您的仓库,然后在快速本地磁盘上,使用脚本git-new-workdir
(在我的框中,在/usr/share/doc/git-core/contrib/workdir
下)。它不是git核心的一部分;它是一个贡献的脚本,但您的发行版的git包可能已安装它。用法是:
git-new-workdir <repository> <new_workdir>
这将创建一个链接到原始存储库的新的独特工作目录。
您可以将.git目录移动到远程共享,然后可以将其替换为名为“.git”的文件,其中包含“gitdir:”。它存储在存储库布局帮助页面中(例如git help repository-layout)。
不确定你的意思是矫枉过正,但我的建议是继续在NFS中使用克隆并推送它。
你可以设置一个post-commit钩子来做一个git push --mirror my-nfs-thing
而不必考虑它。
最重要的是,您始终可以快速,可靠地访问存储库数据(无需担心数据丢失等系统故障等)。