如何将 vim-fugitive 与 git 裸存储库一起使用?

How to use vim-fugitive with a git bare repository?

环境

设置

我使用 git 裸 存储库对我的 config 文件进行版本控制。我可以使用与使用普通 git 存储库相同的命令,只需包含一些 flags:

git --git-dir=/home/kunzaatko/.cfg/ --work-tree=/home/kunzaatko/ __command__

而不是

git __command__

用法

我使用 vim-fugitive 和正常的 git 存储库主要是为了进行重大更改并将其添加到许多不同的提交中,方法是部分暂存(仅一组离散的 hunks/changes)并分别提交。我使用 :Gdiff 来获得我可以使用的漂亮且高效的界面。

渴望

我想用我的配置 git 裸存储库来做到这一点。

我尝试了什么:

  1. 正在将存储库重命名为 .cfg.git。这没有做任何改变。 issue that suggests this should work

  2. 我尝试更改git的b:git_dir内部变量-fugitive:

:let b:git_dir=/home/kunzaatko/.cfg/
  1. 将工作目录更改为 fu 的 git 目录git我认识到它是一个 git 存储库:
:chdir /home/kunzaatko/.cfg/

如果我知道怎么做,什么值得尝试:

  1. 我认为可能有一种方法可以使用 git submodule 命令将裸仓库放入范围。问题是 rootgit 存储库 ... issue that I base this possibility of of

问题

有没有办法将 git 裸 存储库与 git-fugitive?

(或任何其他可以解决我的用例的建议)

环境变量 $GIT_DIR$GIT_WORK_TREE 让您在使用裸存储库时将 git 和 fugitive 指向 dotfile 目录。此解决方案需要注意的是,fugitive/git 将在设置这些变量时忽略其他存储库。

为了限制这种环境污染开始vim像这样:

GIT_DIR=$HOME/.cfg GIT_WORK_TREE=$HOME vim [file(s)]

如果语法不熟悉:可以在大多数(全部?)shell 中调用二进制文件之前预先设置环境变量。这限制了通过环境变量重定向 git 到这个特定的 vim 实例。

提高生活质量的方法是将此行放入 shell 别名或使用功能齐全的点文件管理器,如 yadm,它是 git 裸行的包装器存储库。

我同意@okket的说法,但是我使用那个方法的时候出现了问题

在 Gstatus window 中时,我无法获取已更改文件的状态。我发现 the reason 是 fugitive 从 GIT_DIR 存储库中获取 core.worktree 属性。

所以对我来说,可行的方法如下:

  1. 和@okket说的一样,使用vim/nvim命令时设置GIT_DIR环境变量(GIT_WORK_TREE可以省略):
GIT_DIR=$HOME/.cfg GIT_WORK_TREE=$HOME [n]vim

fish shell 的用户(像我一样),应该使用 env 命令:

env GIT_DIR=$HOME/.cfg GIT_WORK_TREE=$HOME [n]vim
  1. 为您的 git 存储库设置 core.worktree
git --git-dir=$HOME/.cfg --work-tree=$HOME config --local core.worktree $HOME

您可以使用以下命令确保正确:

git --git-dir=$HOME/.cfg --work-tree=$HOME config --local core.worktree

输出应该是你的 HOME 路径。

  1. 如果您通过 git clone --bare ... 获取 git 存储库,您需要取消设置 core.bare 以避免 git 状态错误 warning: core.bare and core.worktree do not make sense:
git --git-dir=$HOME/.cfg --work-tree=$HOME config --unset core.bare

而且这个方法还有一点需要注意。你不能在 $HOME 目录之外使用 fugitive,你会得到 fugitive: working directory does not belong to a Git repository 错误。

PS: I'd like to comment on @okket 's answer, but due to low reputation I can only post a new answer here.