【问题标题】:Different branch with one unique file in gitgit中具有一个唯一文件的不同分支
【发布时间】:2017-12-14 09:28:34
【问题描述】:

我有一个带有 git 服务器的项目。我们是两个开发人员,我们每个人都必须为某些 api 使用不同的令牌。我的主分支、开发分支和测试分支还有另一个 api 密钥。 所有的 api 令牌都存储在一个 config.json 文件中,这意味着 5 个不同的 config.json。

问题是:当将一个分支提交推送或合并到另一个时,我希望我的 config.json 保持不变。

我已尝试使用 .gitignore 文件和git update-index --assume-unchanged config.json 解决方案,但似乎没有一个适合我的情况。 我还找到了 .git/info/except 文件,它似乎确实是我需要的,但无论我尝试什么,config.json 都会显示为“已修改”。

因此,如果您有其他可能的解决方案,或者我的 exept 不起作用的原因,那将非常有帮助!

问候,英二


“缺乏更好”的解决方案:

我使用了@gus3001 的解决方案。 我已经制作了一个文件夹配置,其中包含所有不同的配置(dev / master / testing / etc),以及另一个在.gitignore中引用的preset.json。

所以在每个分支切换上,我们只需要修改被忽略文件中的一个短字符串。 它仍然可能令人困惑和冒险,因此如果您有更好的解决方案,请分享。

【问题讨论】:

    标签: git bitbucket except


    【解决方案1】:

    我通常如何解决这个问题是将用户相关的配置放在一个单独的文件中。所以在你的情况下,我会从 config.json 中取出 api-token 并将其放入一个被 git 忽略的文件中,可能称为 user-config.json

    这可能意味着您必须更改代码才能从新的user-config.json 获取令牌,但好处是您实际上可以正常跟踪config.json 中的非用户相关配置,而不必担心仅在令牌不同时才被 git 忽略,但在其他内容发生更改时不会被忽略。

    tl;dr

    用户相关的配置应该在一个单独的 git-ignored 文件中以避免此类问题。

    【讨论】:

    • 所以这意味着 5 个不同的 X-config.json 而不是一个?
    • 我的意思是,每个用户都有自己的配置,不会被提交。因此,您不会在 repo 中看到其他人的配置。你只会在本地的 user-config.json 中看到你自己的。
    • 这个想法是将改变的事物与不变的事物分开。
    • 但是所有的问题是我们必须在我们的电脑上运行脚本。有时,我们使用我们的版本(自己的分支),有时(例如测试)我们运行测试版本。如果我不提交文件并忽略它,当我们切换时,我们必须在每次打开分支时使用正确的 config.json 更改我们的配置版本......这可能会造成混乱或更糟糕......就像在客户端 api 密钥上运行脚本的错误版本......这种情况可能真的有问题......
    • 好吧,没有更好的,我使用了你的解决方案@gus3001。我已经创建了一个文件夹配置,其中包含所有不同的配置(dev / master / testing / etc),以及另一个在.gitignore中引用的preset.json。所以在每个分支切换上,我们只需要修改被忽略文件中的一个短字符串。
    【解决方案2】:

    我认为您正在寻找的是skip-worktree flag

    skip-worktree 位可以用一个(长)句子来定义:当读取一个条目时,如果它被标记为skip-worktree,那么 Git 会假装它的工作目录版本是最新的,并改为读取索引版本。

    您可以在config.json 文件上设置skip-worktree 标志:

    git update-index --skip-worktree config.json
    

    跳过工作树与假设不变

    skip-worktree 标志与assume-unchanged 不同,assume-unchanged 暗示 Git 不会检查给定文件是否在工作目录中进行修改,因为它假定文件 没有改变

    您可以将“假设未更改”位设置为您未更改的路径,以使 Git 不执行此检查。请注意,在路径上设置此位并不意味着 Git 将检查文件的内容以查看它是否已更改 — 它会使 Git 忽略任何检查并假设它没有更改。

    文档进一步clarifies this point:

    当“假设不变”位打开时,用户承诺不会更改文件并允许 Git 假设工作树文件与索引中记录的内容匹配。

    assume-unchanged 标志确实是一个性能优化,如果您碰巧在一个文件系统比较文件异常缓慢1 或者 - 更有可能 - 如果您正在处理不经常更改的大型文件。

    另一方面,skip-worktree 标志告诉 Git 完全忽略工作目录中的文件副本,只依赖索引中记录的内容。由于这个原因,skip-worktree 的优先级高于assume-unchanged,如果两者都在给定文件上设置。此外,值得注意的是,只要在上游修改文件,assume-unchanged 就会被取消设置,而 skip-worktree 会一直保持,直到您手动取消设置。


    1. 老实说,我想不出任何符合这种描述的现代文件系统。

    【讨论】:

    • 如果我正确理解了文档,这可能是我的解决方案!我试试看。
    • 试一试后嗯:我创建了一个分支diverge,开发分支的子分支并修改了config.json。似乎没有看到任何变化,但是当我尝试切换分支时,出现了经典的提交消息错误。 :/所以在我的情况下不好。不过谢谢,我学到了一个新功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多