使用本地配置分支进行 Git 涂抹和清理

问题描述

我正在处理的项目的本地配置涉及以复杂的方式更改多个文件,这些文件无法提交到任何提交的分支。为了解决这个问题,我已将这些本地配置更改提交到专用的本地分支 Thread,并在启动新的工作分支后一直运行此 bash 脚本 config

config.sh

与另一个 #!/bin/bash # put relevant config files in array mapfile -t files < <(git diff config develop --name-only) # overwrite only those files to my working directory git checkout config -- ${files[@]} # unstage them so they aren't accidentally committed git reset HEAD ${files[@]} echo The following files were successfully overwritten for local configuration: printf '\t%s\n' "${files[@]}" 脚本一起反向执行相同的操作。直接从终端运行,这些脚本运行良好,但我想使用 git 的 .deconfigclean 过滤器进一步简化流程。所以我创建了一个 smudge 文件

.gitattributes

然后将其添加到我的 *.* filter=config 文件中:

.git/config

但是,它只是不起作用。如果我不得不猜测那是因为 git 不希望我运行额外的 [filter "config"] smudge = ./config.sh clean = ./deconfig.sh 作为过滤器的一部分,它本身在 checkout 命令之后针对所有文件运行。 checkoutsmudge 的大多数用例似乎都涉及简单的查找和替换操作,但考虑到所需更改的复杂性,这种方法实施起来很复杂且难以维护。我可以将配置文件存储在某个静态的外部目录中,但我想根据相同的配置分支进行涂抹和清理,因为本地配置本身经常与项目的其余部分一起发展并受益于版本控制,理想情况下分支可以用作其他开发人员本地配置的基线。 Git 的 clean 可能更合适,但 git 的 own documentation 建议完全不要使用它。有没有办法做到这一点?我的 git 配置有问题吗?脚本本身会导致问题吗?还有其他可能的方法吗?

解决方法

尽管没有在任何地方记录,但您不能使用污迹或清洁过滤器来更改工作树的状态。 Git 希望通过将数据传输到文件中并从标准输出读取数据来为每个文件调用一次过滤器。换句话说,这些过滤器旨在基于每个文件调用并仅处理该文件,而不是通过修改工作树状态。

解决问题的最佳方法是避免保留单独的分支。只需将所有文件(包括开发文件和生产文件)保存在某个目录中,然后使用脚本将正确的文件复制到位。运行配置文件的位置应该被忽略,所以脚本不会导致 Git 显示任何修改过的内容。或者,在某处保留一个模板,并让脚本根据环境生成适当的模板。如果您有不应签入的生产机密,这很好;您可以通过环境将它们传递给脚本并生成正确的值。

您所做的与忽略跟踪文件有关,as outlined in the Git FAQ 通常无法成功完成。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...