我有一个不同寻常的想法,那就是使用 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
你可以看到我到达那里的错误信息。我做错了什么?
最佳答案
您只需要确保存储库知道工作树的位置,反之亦然。
要让存储库知道工作树在哪里,请设置配置值 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 命令将根据 --git-dir
参数自动设置 core.worktree
值。
你甚至可以为此添加一个别名:
[alias]
initexternal = !"f() { git --work-tree=. --git-dir=\"$1\" init && echo \"gitdir: $1\" >> .git; }; f"
在只读工作目录上使用 git 版本控制
有了以上知识,你甚至可以在没有写入权限的情况下为工作目录设置 git 版本控制。如果您在每个 git 命令上使用 --git-dir
或从存储库(而不是工作目录)中执行每个命令,您可以省略 .git 文件,因此不需要在工作目录中创建任何文件。另见 Leos answer
关于git - 我可以将 .git 文件夹存储在我想要跟踪的文件之外吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/505467/