Git 拉保持局部变化

我怎样才能安全地更新(拉)一个 git 项目,保持特定的文件不受影响,即使有上游更改?

Myrepo/config/config.php

有没有一种方法,即使这个文件在远程更改,当我 git pull 时,所有其他内容都更新了,但这个文件没有改变(甚至没有合并) ?

附言。我需要做我要求的事情,因为我只编写基于 git 的部署脚本。无法将配置文件更改为模板。

所以,我需要的方式来编写更新脚本,不丢失什么是本地更改。我希望能有一些简单的东西,比如:

git assume-remote-unchanged file1
git assume-remote-unchanged file2

然后是 git pull

227422 次浏览

如果你有一个文件在你的回购,它应该是定制的大多数拉,然后重新命名为类似 config.php.template的文件,并添加到您的 .gitignoreconfig.php

更新: 这从字面上回答了问题,但我认为 KurzedMetal 的答案是真正的你想要的。

假设:

  1. 你在 master分部
  2. 上游分支是 origin中的 master
  3. 您没有未提交的更改

你可以这么做:

# Do a pull as usual, but don't commit the result:
git pull --no-commit


# Overwrite config/config.php with the version that was there before the merge
# and also stage that version:
git checkout HEAD config/config.php


# Create the commit:
git commit -F .git/MERGE_MSG

如果需要经常这样做,您可以为它创建一个别名。请注意,如果您对 config/config.php有未提交的更改,这会将它们丢弃。

有一个基于 Git 存储的简单解决方案。把你改变的东西都藏起来,把新的东西都拿出来,用你的存货。

git stash
git pull
git stash pop

在储藏室里可能会有冲突。在您所描述的情况下,config.php实际上会有一个冲突。但是,解决这个冲突很容易,因为你知道你放进去的东西就是你想要的。所以这样做:

git checkout --theirs -- config.php

我们还可以使用 rebase 尝试 git pull

git pull --rebase origin dev

要回答这个问题: 如果要排除某个签出的某些文件,可以使用 稀疏的退房

  1. .git/info/sparse-checkout中,定义需要保留的内容,在这里,我们需要所有的(*) ,但是(注意叹号) config.php:

    /* !/config.php

  2. 告诉 Git 你想考虑稀疏结帐

    Git config core.SparseCheckout true

  3. 如果您已经在本地获得了这个文件,那么就像 git 在稀疏检出时所做的那样(告诉它必须通过设置“跳过工作树”标志来排除这个文件)

    Git update-index ——略过工作树 config.php

  4. 在存储库中使用 config.php 文件——不管存储库中有什么更改。


请注意,配置值应该不在源代码控制中:

  • 这是一个潜在的安全漏洞
  • 它会导致部署时出现这样的问题

这意味着你必须排除他们(把他们。在第一次提交前访问 gitignore) ,并在签出应用程序的每个实例上创建适当的文件(通过复制和修改“模板”文件)

注意,一旦 git 控制了一个文件,. gitignore 将不会有任何效果。

因此,一旦文件处于源代码管理之下,您只有两个选择() :

  • 重新调整所有历史记录以删除该文件(使用 git filter-branch)

  • 创建一个删除文件的提交。这就像是一场失败的战斗但是,有时候你必须承受这一切。

如果它们是本地未提交的更改,则在拉取时避免合并冲突。

git stash save
git pull
git stash pop

参考资料 -https://happygitwithr.com/pull-tricky.html

我吸毒

git pull -X ours

它将指示 git 在合并时使用本地版本。