如何安全地更新(拉取)一个git项目,保持特定文件不变,即使上游有更改?
myrepo/config/config.php
有没有一种方法,即使这个文件在远程被更改,当我git pull时,其他所有内容都更新了,但这个文件没有改变(甚至没有合并)?
PS.我需要做我所要求的,因为我只编写基于git的部署脚本。我不能将配置文件更改为模板。
因此,我需要一种方法来编写更新脚本,不会丢失本地更改的内容。
git assume-remote-unchanged file1
git assume-remote-unchanged file2
然后git pull
7条答案
按热度按时间t0ybt7op1#
有一个基于Git stash的简单解决方案。把你修改过的东西都藏起来,把所有新的东西都拉出来,然后应用你的stash。
在stash pop上可能会有冲突。在你描述的情况下,实际上会有
config.php
的冲突。但是,解决冲突很容易,因为你知道你放在stash中的是你想要的。所以这样做:toiithl62#
我用
这将指示git在合并时使用本地版本。
bf1o4zei3#
如果你的仓库中有一个文件,它应该是由大多数提取器定制的,那么将该文件重命名为类似
config.php.template
的文件,并将config.php
添加到你的.gitignore
中。44u64gxh4#
假设:
1.你在分支上
master
1.上游分支为
origin
中的master
1.您没有未提交的更改
你可以做:
如果你需要经常这么做,你可以为它创建一个别名。注意,如果你有未提交的
config/config.php
更改,这将把它们扔掉。zqry0prt5#
我们也可以尝试使用git pull和rebase
8tntrjer6#
如果它们是本地未提交的更改,则在拉取时避免合并冲突。
参考-https://happygitwithr.com/pull-tricky.html
de90aj5v7#
回答这个问题:如果要排除 checkout 的某些文件,可以使用sparse-checkout
1.在
.git/info/sparse-checkout
中,定义你想要保留的内容。这里,我们想要所有()但是(注意感叹号)config.php:/!/config.php
1.告诉git你想考虑稀疏 checkout
git config core.sparseCheckout true
1.如果您已经在本地获取了这个文件,那么就像git在稀疏 checkout 时所做的那样(告诉它必须通过设置“skip-worktree”标志来排除这个文件)
git update-index --skip-worktree config.php
1.享受您的config.php文件属于您的存储库-无论存储库上有什么更改。
请注意,配置值不应该在源代码控制中:
这意味着您必须排除它们(在第一次提交之前将它们放入.gitignore),并在您 checkout 应用的每个示例上创建相应的文件(通过复制和修改“模板”文件)
请注意,一旦一个文件被git接管,.gitignore就不会有任何效果。
鉴于此,一旦文件处于源代码控制之下,您只有两个选择():
git filter-branch
)