176

我如何安全地更新(拉取)一个 git 项目,保持特定文件不受影响,即使上游发生了变化?

myrepo/config/config.php

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

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

所以,我需要编写不会丢失本地更改的更新脚本的方法。我希望有一些简单的东西:

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

然后git pull

4

7 回答 7

319

有一个基于 Git stash 的简单解决方案。存储您更改的所有内容,提取所有新内容,应用您的存储。

git stash
git pull
git stash pop

在 stash pop 上可能存在冲突。在您描述的情况下,实际上会有冲突config.php。但是,解决冲突很容易,因为您知道放入存储库中的内容就是您想要的。所以这样做:

git checkout --theirs -- config.php
于 2012-05-02T14:42:20.900 回答
17

如果您的 repo 中有一个文件应该由大多数 pullers 自定义,则将该文件重命名为类似的名称config.php.template并添加config.php到您的.gitignore.

于 2012-05-02T13:39:56.583 回答
8

我用

git pull -X ours

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

于 2021-07-29T16:52:07.123 回答
7

更新:这从字面上回答了所提出的问题,但我认为KurzedMetal 的答案确实是您想要的。

假如说:

  1. 你在树枝上master
  2. 上游分支masterorigin
  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,这会将它们丢弃。

于 2012-05-02T13:40:14.133 回答
4

我们也可以尝试 git pull 和 rebase

git pull --rebase origin dev
于 2017-01-06T14:49:14.563 回答
2

要回答这个问题:如果要排除结帐的某些文件,可以使用sparse-checkout

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

    /* !/config.php

  2. 告诉 git 你要考虑 sparse-checkout

    git config core.sparseCheckout true

  3. 如果您已经在本地获取了此文件,请执行 git 在稀疏结帐时执行的操作(告诉它必须通过在其上设置“skip-worktree”标志来排除此文件)

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

  4. 享受您的 config.php 文件属于您的存储库 - 存储库上的任何更改。


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

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

这意味着您必须排除它们(在第一次提交之前将它们放在 .gitignore 中),并在您签出应用程序的每个实例上创建适当的文件(通过复制和调整“模板”文件)

请注意,一旦文件由 git 负责,.gitignore 将不会产生任何影响。

鉴于此,一旦文件受源代码控制,您只有两个选择 () :

  • 重新设置所有历史记录以删除文件(使用git filter-branch

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

于 2020-01-16T10:05:50.493 回答
1

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

git stash save
git pull
git stash pop

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

于 2020-07-13T09:54:11.770 回答