如何安全地更新(拉取(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的答案确实是你想要的。
假设:
- 您在分支
master
- 上游分支
master
origin
- 您没有未提交的更改
....你可以做:
# 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
要回答问题:如果要排除签出的某些文件,可以使用稀疏签出
-
在
.git/info/sparse-checkout
中,定义要保留的内容。在这里,我们想要所有(*(,但(注意感叹号(配置.php :/*!/配置.php
-
告诉 git 你想考虑稀疏结账
git config core.sparseCheckout true
-
如果你已经在本地有了这个文件,请执行 git 在稀疏签出时所做的操作(告诉它必须通过在其上设置"skip-worktree"标志来排除此文件(
git update-index --skip-worktree config.php
-
享受您的配置.php文件属于您的存储库 - 无论存储库上有什么更改。
请注意,配置值不应该在源代码管理中:
- 这是一个潜在的安全漏洞
- 它会导致部署出现这样的问题
这意味着您必须排除它们(在首次提交之前将它们放在 .gitignore 中(,并在您签出应用程序的每个实例上创建适当的文件(通过复制和改编"模板"文件(
请注意,一旦文件由 git 负责,.gitignore 将不会产生任何影响。
鉴于文件受源代码管理后,您只有两个选择 ((:
-
重定所有历史记录以删除文件(带
git filter-branch
( -
创建删除文件的提交。这就像打一场失败的战斗,但是,好吧,有时你必须忍受它。