19

我正在创建一个合并驱动程序。我已经定义了一个 .gitattributes 文件,如下所示:

filename merge=mergeStrategy

我在 $PROJECT/.git/config 中创建了合并驱动程序,如下所示:

[merge "mergeStrategy"]
    name = My merge strategy
    driver = scripts/mergeScript.sh

这在本地工作正常,但我想将此合并驱动程序提交到 git 存储库,以便合并策略对每个人都有效。

有没有办法可以将此(或其他 Git 配置选项)添加到存储库本身?

4

1 回答 1

11

您可以简单地添加和提交(和推送)script/mergeScript(当然,连同.gitattributes文件一起)

只要:

  • mergeScript不知何故在$PATH执行合并驱动程序的用户中。
  • mergeScript是可执行的,chmod +x
  • mergeScript没有扩展名,以便您稍后在需要时更改其内容(从 bash shell 到 Perl 脚本再到 C 可执行文件到 ...)。

(谢谢你,MestreLion,最后两点,正如他在评论中提到的那样)

你在本地就是这种情况,因为我怀疑 ' .' 在你的 ' 中$PATH,但你不能假设每个人都是这样。

但是,本地配置文件 ( .git/config) 不会被推送/克隆(正如Alexandr Priymak在评论中指出的那样),因此用户仍然需要复制自定义合并驱动程序的声明。

这是一项基本的安全措施,以便您不会推送潜在的“有害”脚本,该脚本将在下一次合并时自动执行。

另一种方法使用Makefile

另一种选择是保留所有 git 驱动程序和.gitattributes版本历史记录,包括可以轻松激活所有驱动程序的内容。例如,使用Makefile的一个项目具有特殊目标make gitdrivers,该目标激活了 repo 中的所有 git 驱动程序。

这是必需的,因为git将自定义驱动程序视为潜在的安全漏洞,您需要做一些事情来授予对任何新驱动程序的信任。合并驱动程序和其他钩子是在您的用户凭据上运行的可执行代码,它们会作为 git 操作的副作用自动启动,因此显然在运行该代码之前必须格外小心。

运行更改.git/config以激活驱动程序的代码是授予信任的 git 样式。

实际上,您可以使用Makefile它(但您可以使用适合您项目的任何构建系统或脚本)。对于 Ubuntu Linux 主机,您可以简单地执行以下操作(以三个驱动程序为例):

在文件中.gitattributes

[attr]POFILE merge=merge-po-files
[attr]IMAGE diff=image
[attr]BINARY diff=binary -merge -text

locale/*.po POFILE
data/*.img BINARY
*.png IMAGE

和 in Makefile(缩进应该只使用 U+0009 TAB 字符,但 stackoverflow.com 不支持它):

developer-dependencies:
        sudo apt install required-package1 required-package2

submodules:
        @echo "Overwriting submodules with committed versions..."
        git submodule sync
        git submodule update --init

gitdrivers: developer-dependencies submodules
        @echo "Overwriting git drivers with current version..."
        git config merge.merge-po-files.driver "./bin/merge-po-files %A %O %B"
        # show rough thumbnails in text mode for images
        git config diff.image.textconv "./bin/image-textconv"
        git config diff.image.binary "true"
        git config diff.image.cachetextconv "true"
        # show some extra information about binary files
        git config diff.binary.textconv "./bin/binary-textconv"
        git config diff.binary.binary "true"
        @echo "All git drivers done."

where 文件merge-po-filesimage-textconv并且binary-textconv是项目子目录中合适的可执行文件bin。如果您有一个需要在多个平台上工作的项目,您可能需要额外的依赖来为当前平台构建/链接正确的二进制文件。

示例配置告诉git在差异中呈现图像的 ASCII 表示,将 gettext .PO 文件与特殊的合并驱动程序合并,并防止合并选定的二进制文件,即使git启发式将这些文件声明为文本。相反,需要为标记为 的文件选择一个版本或另一个版本BINARYBINARY并显示差异中文件的特殊用户可见摘要。

这样,所有开发人员只需要在make gitdrivers完成初始克隆后运行一次。当他们稍后合并或重新调整他们的工作副本时,他们会自动获取他们已经安装的驱动程序的更新。如果他们不确定自己是否有最新的驱动程序,他们可以随时重新运行相同的命令。请注意,上面的示例将重置您拥有的所有子模块,这些子模块可能是您真正想要的,也可能不是您真正想要的。

TL;DR: 不包含在存储库中,但您可以包含一个使用命令.git/config重新创建合适配置的脚本。git config对于类 UNIX 系统,shell 脚本非常棒。如果您的项目需要构建代码,您可以在需要时安装所需的驱动程序来构建过程。另请注意,使用git config ...命令而不是尝试直接修改配置文件要安全得多,因为即使将来该配置文件的文件格式发生更改,这些命令也会继续工作。

于 2012-01-12T17:35:32.763 回答