git 子模块中的本地 git 配置

Local git config in git submodule

我的存储库结构:

repo_a
└── repo_b
    └── .gitconfig

repo_b 是一个子模块。
.gitconfig:

[alias]
    b = branch

如何添加 .gitconfig 的路径,以便只有 repo_b 可以使用它?

预期输出:

$ cd repo_a
$ git b
git: 'b' is not a git command. See 'git --help'.
$ cd repo_b
$ git b
* master

编辑#1:

@jthill 和@bk2204 的回答很好
他们描述了如何使用以下方法访问子模块的配置文件:

git rev-parse --git-path config

我要指定我想要的。
我希望 repo_b 中的 .gitconfig 文件中的更改由 git 跟踪。这样当仅克隆 repo_b 我也可以访问相同的 .gitconfig.
@jthill 的解决方案似乎确实可行。然而,它似乎也很容易出错,我必须为 git 中的每一个可能改变 .gitconfig 的变化添加一个钩子。比如git pull, git checkout, git merge.

因此我的问题将分为两部分:

  1. 如何跟踪 repo/.gitconfig 的更改并将其用作本地配置文件?
  2. 如何在普通回购和子模块中实现上述功能?

我认为不可能:

正在阅读 the section of the Git manual corresponding to the configuration of submodules,似乎有 2 个可能的选项是:

  • 正在子模块的根目录中创建名为 config 的文件
  • 正在向超级项目的.gitmodules文件添加内容

我尝试在这两个文件中添加别名,但别名没有生效。

编辑:

实际上,现在我正在花时间思考,这不可能是有道理的,因为 git-submodule 的代码并不是以您会 运行 git 来自子模块的命令,而是直接来自超级项目。

如果您从子模块中 运行 您的 git 命令为您的子模块,那么您没有使用子模块的功能。在这种情况下,您最好在超级项目中创建一个普通的存储库并将其路径添加到超级项目的 .gitignore 文件中。可能更好的方法是学习处理来自超级项目的子模块。

如果您正在寻找子模块的 .git/config 等价物,那么找到它的最简单方法是从 repo_b 中 运行 git rev-parse --git-path config。这是为本地存储库设置配置的最简单方法。

您不能将 .gitconfig 文件放入存储库并期望它被使用;在存储库中共享配置是不安全的,因此 Git 不允许。

如果您想使用 git config 编辑本地配置,您可以通过更改为 repo_b.

来实现

作为抽烟测试,您可以让使用回购的人做

cat .gitconfig >>$(git rev-parse --git-dir)/config

这会将您的配置附加到存储库设置中。为了更安全的版本,

sed -si '/^# --repo-b-config--$/,/^# --repo-b-config--$/d; $r .gitconfig' \
        $(git rev-parse --git-dir)/config

并且在你的特殊文件的顶部和底部有 # --repo-b-config-- 行。

Git 有意不允许 fetch 覆盖管理选择。没有办法让 fetch 篡夺任何东西。您的存储库是您的。你决定里面会发生什么,这意味着除非你自己为他们建造通道,否则没有人能偷偷溜进去任何东西。您可以 运行 在结帐时使用任意命令来更新本地配置或其他任何内容,但是在您的存储库中,在您管理的每个存储库中(例如包括您使用 git clonegit init 创建的每个存储库)或 git submodule update --init) 您可以控制这些命令是什么。

因此,如果您想在每次结帐后拥有上述 sed 运行,请将其(possibly-fixed-up 版本)放入该回购的 hooks/post-checkout 中,然后您'都会有你想要的。

出于安全考虑,我没有实现此功能。

我决定在 JSON 中使用一个单独的配置文件,并将我需要的值存储在那里。
因此我可以在需要时解析配置文件而不是使用 git.