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

标签 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

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

最佳答案

您只需要确保存储库知道工作树的位置,反之亦然。

要让存储库知道工作树在哪里,请设置配置值 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/

相关文章:

git - 在另一个 git 仓库中维护一个 Git 仓库

git log grep 里面的内容变化

git - 列出 Git 存储库分支中某个时刻存在的文件夹的所有子文件夹

git - 如何使 git push 与 Cygwin 一起工作?

git - 如何删除 GitHub 上的提交?

php - 如何为现有的 Typo3 网站搭建本地开发环境?

git - 为什么我会与 git rebase -p -i 发生冲突?

git - 如何在 LAN 上创建远程服务器而不是使用 GitHub?

git - 向 GitHub 添加 SSH key 的目的是什么?

linux - 在 Linux/Windows dualboot 之间共享 NTFS 分区上的 git repo