git 拉取保留本地未提交的更改

  • 本文关键字:提交 保留 git git
  • 更新时间 :
  • 英文 :


如何安全地更新(拉取(git 项目,保持特定文件不变,即使有上游更改?

Myrepo/config/config.php

有没有办法,即使这个文件在远程上被更改,当我 git pull 时,其他一切都会更新,但这个文件没有改变(甚至没有合并(?

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

因此,我需要编写不会丢失本地更改内容的更新脚本的方法。我希望能有这样简单的东西:

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

然后git pull

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

git stash
git pull
git stash pop

在藏匿流行音乐上可能存在冲突。 在您描述的情况下,实际上config.php会有冲突。 但是,解决冲突很容易,因为您知道放入藏匿处的东西就是您想要的。 所以这样做:

git checkout --theirs -- config.php

我使用

git pull -X ours

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

如果您的存储库中有一个文件,它应该由大多数拉取器自定义,则将该文件重命名为 config.php.template 并将config.php添加到您的.gitignore中。

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

假设:

  1. 您在分支master
  2. 上游分支master origin
  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 stash save
git pull
git stash pop

源:

https://git-scm.com/docs/git-stash

我们也可以尝试使用 rebase 进行 git pull

git pull --rebase origin dev

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

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

    /*!/配置.php

  2. 告诉 git 你想考虑稀疏结账

    git config core.sparseCheckout true

  3. 如果你已经在本地有了这个文件,请执行 git 在稀疏签出时所做的操作(告诉它必须通过在其上设置"skip-worktree"标志来排除此文件(

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

  4. 享受您的配置.php文件属于您的存储库 - 无论存储库上有什么更改。

<小时 />

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

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

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

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

鉴于文件受源代码管理后,您只有两个选择 ((:

  • 重定所有历史记录以删除文件(带git filter-branch(

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

最新更新