git pull保持局部变化

时间:2012-05-02 13:29:22

标签: git

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

myrepo /配置/ config.php中

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

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

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

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

然后git pull

7 个答案:

答案 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确实是你想要的。

假设:

  1. 你在分行master
  2. master
  3. 中的上游分支为origin
  4. 您没有未提交的更改
  5. ....你可以这样做:

    # 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

  1. <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

  2. 告诉git您要考虑稀疏结帐

    git config core.sparseCheckout true

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

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

  4. 在您的config.php文件所在的位置享受一个存储库-不管存储库中有什么更改。


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

  • 这是潜在的安全漏洞
  • 它会引起诸如此类的部署问题

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

请注意,一旦git负责文件,.gitignore将不会起作用。

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

  • 恢复所有历史记录以删除文件(使用.git/info/sparse-checkout

  • 创建一个删除文件的提交。就像在一场艰苦的战斗中一样,但是,有时候,您必须忍受这一点。

答案 5 :(得分:0)

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

git stash save
git pull
git stash pop

引荐-https://happygitwithr.com/pull-tricky.html

答案 6 :(得分:0)

我用

DECLARE @Test DATETIME2 = CONVERT(DATETIME2, '2022-08-19T20:25', 126)

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