如何安全地更新(拉取)git项目,保持特定文件不变,即使上游有变化?
myrepo /配置/ config.php中
有没有办法,即使这个文件在远程更改,当我git pull,其他一切都被更新,但是这个文件没有改变(甚至没有合并)?
PS。我需要做我要问的事,因为我只是在编写基于git的部署脚本。我无法将配置文件更改为模板。
所以,我需要编写不会丢失本地更改的更新脚本。我希望有一些简单的事情:
git assume-remote-unchanged file1
git assume-remote-unchanged file2
然后git pull
答案 0 :(得分:211)
有一个基于Git stash的简单解决方案。存放你已经改变的所有内容,拉出所有新内容,应用你的藏匿处。
git stash
git pull
git stash pop
在藏匿流行音乐中可能存在冲突。在您描述的情况下,config.php
实际上会发生冲突。但是,解决冲突很容易,因为你知道你在藏匿处放置的是你想要的东西。所以这样做:
git checkout --theirs -- config.php
答案 1 :(得分:15)
如果您的仓库中有一个文件应该由大多数拉拔器定制,那么将文件重命名为config.php.template
,并将config.php
添加到.gitignore
。< / p>
答案 2 :(得分:5)
更新:这确实回答了问题,但我认为KurzedMetal's answer确实是你想要的。
假设:
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
进行了未提交的更改,则会将其丢弃。
答案 3 :(得分:3)
我们也可以尝试git pull with rebase
git pull --rebase origin dev
答案 4 :(得分:2)
要回答这个问题:如果要排除某些结帐文件,可以使用sparse-checkout
在<p class="sqlcolor" style="color:black;font-family:Verdana;">
<span class="sqlnumbercolor" style="color:"></span>
<span class="sqlkeywordcolor" style="color:mediumblue">SELECT</span> f.name, f.plz, f.ort, f.strasse<br>
<span class="sqlkeywordcolor" style="color:mediumblue">FROM</span> FIRMA f, FIRMA_GEWERKE fg, GEWERKE g<br>
<span class="sqlnumbercolor" style="color:"></span>
<span class="sqlkeywordcolor" style="color:mediumblue">WHERE</span> fg.FG_GEWERKE_ID = g.GEWERKE_ID <br>
<span class="sqlkeywordcolor" style="color:mediumblue">AND</span> f.firma_ID = fg.FG_FIRMA_ID <br>
<span class="sqlkeywordcolor" style="color:mediumblue">AND</span> g.gewerke_ID =
<span class="sqlstringcolor" style="color:brown">6</span> <br>
<span class="sqlkeywordcolor" style="color:mediumblue">AND</span> fg.active =
<span class="sqlstringcolor" style="color:brown">0</span> <br>
<span class="sqlkeywordcolor" style="color:mediumblue">ORDER BY</span> f.name;
</p>
<p class="sqlcolor" style="color:black;font-family:Verdana;">
<span class="sqlnumbercolor" style="color:"></span>
<span class="sqlkeywordcolor" style="color:mediumblue">SELECT</span> f.name, g.bezeichnung<br>
<span class="sqlkeywordcolor" style="color:mediumblue">FROM</span> firma f, gewerke g, firma_gewerke fg <br>
<span class="sqlnumbercolor" style="color:"></span>
<span class="sqlkeywordcolor" style="color:mediumblue">WHERE</span> f.firma_id = fg.fg_firma_id <br>
<span class="sqlkeywordcolor" style="color:mediumblue">AND</span> g.gewerke_id = fg.fg_gewerke_id <br>
<span class="sqlkeywordcolor" style="color:mediumblue">AND</span> f.firma_id =
<span class="sqlstringcolor" style="color:brown">493</span>; <br>
中,定义要保留的内容。在这里,我们需要所有(*),但(请注意感叹号)config.php:
/ * !/config.php
告诉git您要考虑稀疏结帐
git config core.sparseCheckout true
如果您已经在本地获取此文件,请执行git在稀疏签出时执行的操作(告诉它必须通过在其上设置“ skip-worktree”标志来排除此文件)
git update-index --skip-worktree config.php
在您的config.php文件所在的位置享受一个存储库-不管存储库中有什么更改。
请注意,配置值不应在源代码管理中:
- 这是潜在的安全漏洞
- 它会引起诸如此类的部署问题
这意味着您必须排除它们(在首次提交之前将它们放入.gitignore中),并在您签出应用程序的每个实例上创建适当的文件(通过复制和改编“模板”文件)
请注意,一旦git负责文件,.gitignore将不会起作用。
鉴于该文件受源代码控制,您只有两个选择():
恢复所有历史记录以删除文件(使用.git/info/sparse-checkout
)
创建一个删除文件的提交。就像在一场艰苦的战斗中一样,但是,有时候,您必须忍受这一点。
答案 5 :(得分:0)
以防它们是本地未提交的更改,并避免在合并时发生合并冲突。
git stash save
git pull
git stash pop
答案 6 :(得分:0)
我用
DECLARE @Test DATETIME2 = CONVERT(DATETIME2, '2022-08-19T20:25', 126)
这将指示 git 在合并时使用本地版本。