我可以将.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?