背景: 我正在处理一个存储库,该存储库包含运行另一个程序所需的文件。由于其他程序的性质,需要调用其他文件的文件必须使用完整的文件路径。所有这些文件都存储在存储库中,因此我制作了一个污迹/清理过滤器以将文件路径从通用路径更改为存储库位置的路径。这个解决方案是必需的,因为可能会有多个人将存储库克隆到不同的位置以进行修改和测试。
问题: 过滤器工作正常,但我现在遇到的问题是,每当我签出一个新分支时,clean 过滤器就会运行,而不是 smudge 过滤器。据我了解,污迹过滤器应该是结账时运行的,而不是清洁过滤器。有谁知道为什么清洁过滤器在污迹过滤器应该运行时运行以及如何解决这个问题?
观察: 从设置为使用过滤器的分支跳转和未设置为使用过滤器的分支不使用过滤器。
从未设置为使用过滤器的分支跳转到使用它们的一个设置时,使用污迹过滤器。
在设置为使用过滤器的两个分支之间切换时使用清洁过滤器。
当文件被删除并再次签出时运行污迹过滤器。
清洁过滤器在运行时看似随机运行
git status
.
通过设置
GIT_TRACE=1
并查看 git 正在运行的行以及在过滤器脚本中将一些更新从 stdout 传输到 stderr 以确认每个文件正在使用哪些过滤器,以便它们出现在命令窗口中。
首先,不要忘记考虑其他选项,这将避免完全需要内容过滤器(污迹/清洁)。
如果您的程序包含“需要调用其他文件的文件必须使用完整的文件路径”,则所述文件可以使用环境变量来引用那些其他文件(使用绝对路径)。
然后不需要“将文件路径从通用路径更改为存储库位置的路径”。
git switch
而不是 旧的和令人困惑的 git checkout
命令 时问题是否仍然存在。这假设您使用的是 Git 2.23+(2019 年第三季度)
第三,使用足够新的 Git also 允许使用 trace2 API。
export GIT_TRACE2=~/log.normal
git switch another Branch
# or
export GIT_TRACE2_EVENT=~/log.event
git switch another Branch
那些将包括更多的细节,而不仅仅是
GIT_TRACE
.