我可以将.git文件夹存储在我想跟踪的文件之外吗?

我有一个不寻常的想法,使用git作为备份系统。 假设我有一个目录./backup/myfiles,我想用git来支持它。 为了保持干净,我不想在myfiles文件夹中有.git目录,所以我想我可以创建./backup/git_repos/myfiles。 从查看git文档,我试过这样做:

$ cd backup/myfiles
$ mkdir ../git_repos/myfiles
$ git --git-dir=../git_repos/myfiles init
Initialized empty Git repository in backup/git_repos/myfiles/
$ git --git-dir="../git_repos/myfiles/" add foo
fatal: pathspec 'foo' did not match any files

你可以看到我到达那里的错误信息。 我究竟做错了什么?


git --git-dir=../repo --work-tree=. add foo

这将做你想要的,但当你必须用你使用的每一个git命令来指定它的时候,它会显得很糟糕。

你可以导出GIT_WORK_TREE=.GIT_DIR=../backup ,Git会在每个命令中选择它们。 尽管如此,这只能让你轻松地在每个shell的单个存储库中工作。

我宁愿建议将.git目录符号链接到其他位置,或者从主备份目录创建符号链接到.git目录。


您只需确保存储库知道工作树在哪里,反之亦然。

要让存储库知道工作树在哪里,请设置配置值core.worktree 。 为了让工作树知道它的git目录是什么,添加一个名为.git的文件(不是文件夹!)并添加一行

gitdir: /path/to/repo.git

因为git 1.7.5 init命令为此学习了一个额外的选项。

您可以使用初始化一个新的独立存储库

git init --separate-git-dir /path/to/repo.git

这将初始化独立目录中的git存储库,并将.git文件添加到当前目录中,该目录是新存储库的工作目录。

以前到1.7.5,你必须使用稍微不同的参数,并自己添加.git文件。

要初始化单独的存储库,以下命令将工作树与存储库链接起来:

git --git-dir=/path/to/repo.git --work-tree=. init && echo "gitdir: /path/to/repo.git" > .git

你当前的目录将是工作树,git将使用/path/to/repo.git的存储库。 init命令将自动设置core.worktree值,并使用--git-dir参数指定。

你甚至可以为此添加一个别名:

[alias]
    initexternal = !"f() { git --work-tree=. --git-dir="$1" init && echo "gitdir: $1" >> .git; }; f"

在只读工作目录上使用git版本控制

有了以上的知识,你甚至可以在没有写权限的情况下为工作目录设置git版本控制。 如果您在每个git命令中使用--git-dir或者从存储库(而不是工作目录)执行每个命令,则可以省略.git文件,因此不需要在工作目录中创建任何文件。 另请参阅青少狮的答案


git init (和git clone )的--separate-git-dir选项可用于在我的git版本( 1.7.11.3 )上完成此操作。 该选项将git存储库与工作树分开,并在工作树的根目录中创建文件系统不可知的git符号链接(以名为.git的文件的形式)。 我认为结果与尼克斯的答案相同。

git init --separate-git-dir path/to/repo.git path/to/worktree
链接地址: http://www.djcxy.com/p/411.html

上一篇: Can I store the .git folder outside the files I want tracked?

下一篇: Checkout old commit and make it a new commit