【问题标题】:Ignore changes to a tracked file忽略对跟踪文件的更改
【发布时间】:2015-11-21 22:24:57
【问题描述】:

我只想更改跟踪文件以用于开发,但保持跟踪版本不变。

这个建议的大多数“解决方案”

git update-index --assume-unchanged

但这完全没用,因为文件仍然会通过结帐或重置来更改。是否有更好的解决方案可以在结帐和重置命令中幸存下来?

【问题讨论】:

  • 认为你可以在你的开发分支中.gitignore它。话又说回来,这闻起来很有趣——你确定你没有提交所有意图和目的的配置文件吗? :)
  • checkout 不会撤消您的更改。在最坏的情况下,Git 会告诉您在拉取和签出期间可能会发生合并冲突。 reset 肯定会影响您的更改。为什么不创建一个主题分支来编辑文件并提交这些更改?
  • .gitignore 似乎在添加文件后什么都不做。它只会停止未跟踪的文件。是的,这是一个配置文件,我想保持上游版本不变。
  • 你在哪个分公司工作?大师、开发、主题分支?

标签: git file ignore


【解决方案1】:

快速修复

这就是我认为您正在尝试做的事情,更改文件,但在提交时忽略它。

git update-index --skip-worktree my-file

这是关于difference between assume-unchanged and skip-worktree 的一个很好的答案。

如果您尝试将更改合并到 my-file,Git 仍会发出警告。然后你必须“取消跳过”文件,合并它并“重新跳过”它。

git update-index --no-skip-worktree my-file
# merge here
git update-index --skip-worktree my-file

如果您修改文件,然后切换到该文件已更改的分支,也可能会出现问题。您可能需要做一些花哨的“跳过/取消跳过”操作来解决这个问题。

长期修复

从长远来看,您可能希望将“本地”更改分离到第二个文件中。例如,如果您要更改的文件是配置文件,请创建一个“默认”配置文件,然后将其签入存储库。然后,允许第二个可选的“覆盖”配置文件,并将该文件放入您的.gitignore

然后,在您的应用程序中,读取默认配置文件,然后检查覆盖文件是否存在。如果是,则将该数据与默认文件中的数据合并。

此示例用于配置文件,但如果需要,您可以将该技术用于其他类型的覆盖。

【讨论】:

  • --skip-worktree 正是我想要的,根据描述。谢谢你。修改项目以使这项工作在我看来是错误的。
【解决方案2】:

由于您在其中一个 cmets 中直接在 master 分支中工作,因此要解决的真正问题是在 master 中工作。

您需要在 Git 中创建一个主题分支:

git checkout -b some_feature_or_bug_fix master

然后对配置文件进行必要的更改,并正常提交。

这里的好处是您不会影响master 中的文件。如果您需要拉入更新的代码,只需将git fetchgit merge origin/master 放入您的主题分支。然后,您可以像正常的 Git 合并一样处理对配置文件的上游更改。

在将您的主题分支合并到 master 之前,您可以进行交互式 squash 以减少您的提交并将提交合并为一个漂亮、干净的提交。或者使用git merge --squash 将您的主题分支合并到master

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 2011-10-30
    • 2015-09-27
    • 2011-02-03
    相关资源
    最近更新 更多