git如何在不同的分支中保持不同的配置文件?

标签 git

请允许我先说说我的尝试。假设我有两个分支,Alice1 和 Alice2。 Alice1 有自己的服务器,Alice2 也有自己的服务器。我希望能够 checkout 到 Alice1,编写我的代码,然后通过使用保存在 URL 配置文件中的 URL 直接推送代码来在自己的服务器上测试它,因此它必须留在本地。 Alice2 也有自己的服务器,如果代码在 Alice1 上测试正常,我会 checkout 到 Alice2,并与 Alice1 同步,然后将其推送到 Alice2 的服务器上。有时我希望 Alice1 和 Alice2 有独立的测试环境,这样它们就可以分开,直到我想 merge 它们。

我已经研究了很长时间,但仍然没有找到可靠的答案。最流行的解决方案是使用 .gitattribute 和 do merge=ours 但它的缺点是 git 有时会在转发时忽略它们。我在 merge 时也尝试过 checkout 文件,但这只适用于一次 merge 而不是每次 merge 。 Gitignore 显然不起作用,因为它们不跟踪此文件,因此此文件中的所有更改都将丢失。

目前,我有两个分支,master 和 dev。有一个文件调用 .clasp.json。我希望这个文件在每次 checkout 时在这些分支中都不同,并且 merge 不应触及这些文件。

我在想是否可以写一个脚本,每次 checkout 到一个分支时,根据分支名称生成文件,我不知道是否有办法做到这一点?我发现我可以使用内容过滤器驱动程序,但那里没有直接的文档,请问有什么建议吗?

我尝试过的:此方法在一次 merge 中有效,但文件仍会在下一次 merge 中 merge 。 https://stackoverflow.com/a/4516022

什么是 .gitattributes 与 merge=ours 的正确用法 此方法仅在存在 merge 冲突时才有效,在我的情况下,我不会在第一次编辑后编辑文件,我只是希望它保持不同每个分支。

最佳答案

您不能在 Git 中执行此操作的原因是 Git 与分支无关。1

好吧,不能太强了:正如您在问题中所展示的那样,您可以手动完成。不过,您是对的,在 .gitattributes 中使用 merge 驱动程序是行不通的。原因是当您确实运行git merge时,Git:

  • 计算 merge 基础;
  • 将基础中的配置文件与每个分支提示中的配置文件进行比较;和
  • 如果文件只有一个 branch-tip commit 不同,则使用该文件的branch-tip-commit 版本。

如果您可以手动选择文件的 merge 基础版本,则可以避免三个输入文件中的两个匹配的情况,但您不能那样做。

那么,您可以做什么?有几类选项:

  • checkout 后脚本;
  • 过滤驱动;
  • Git 本身之外的东西。

过滤器驱动程序的想法很吸引人,但它有一个可怕的缺陷:它运行之前 Git 会告诉您哪个分支名称提供给 git checkout git switch 命令。

checkout 后脚本方法可以工作。然而,它确实导致了第三种方法:根本不要在 Git 中这样做。原因是您不想修改跟踪文件(在 Git 的索引/暂存区中的文件),这会在以后产生各种操作问题。

第三种方法是真正有效的方法。 使用未跟踪和忽略的文件,或完全在 Git 存储库之外的文件,或启动指令来保存配置。允许此文件或启动指令包含其他Git 中 的文件,如果您愿意,和/或 Git 中的文件构建此文件。让您的软件从 Git 中维护的文件中读取默认值,如果这有用的话。但在别处保留实际配置。

现在配置位于 Git 存储库之外,您可以让 Git 管理存储库中 中的文件,而不会让 Git 损坏配置。


1更准确地说,Git 关于提交的。提交保留文件,但 Git 与文件无关; branch names 保存提交哈希 ID,但 Git 也与分支名称无关。我们在这里关心的 Git 操作—— checkout 和 merge ,即——在提交的基础上工作,提交的“真名”是它的哈希 ID。许多提交同时在多个分支上,有些提交有时根本不在任何分支上。对于没有分支名称的提交,分支名称不能作为提交存在的基础。由于某些提交是多个分支的尖端,并且提交中存储的文件是只读的,因此文件实际上不能依赖于分支名称。分支名称可以更改,名称可以四处移动。提交一旦做出,将永远固定。

最后,这里只是存在根本性的不匹配。如果您认为 Git 是关于提交的——而不是分支或文件——提交保存文件,那么一切正常。如果您认为 Git 是关于分支的,那么有些部分就是不合适的。

关于git如何在不同的分支中保持不同的配置文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63628756/

相关文章:

javascript - 如何使用提交版本更新本地路径?

python - GitPython 检查 git pull 是否更改了本地文件

git - 如何: find string in GitHub repo?

ios - fatal error : Could not create a path to the bundle

Git:如何在命令行上指定包含八进制符号的文件名

git - 如何通过错误修复更新标签

Git:将不同的变更集推送到 heroku

git - Git 中两个或多个 User.Name 有什么用。

git - 如何将文件夹中的所有文件推送到所有git分支

git - 如何在不知道 "exact"名称的情况下恢复 Azure DevOps git 中已删除的分支