git pull保持本地更改


132

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

myrepo / config / config.php

有没有办法,即使在远程更改此文件时,当我进行git pull时,其他所有内容也会更新,但是此文件未更改(甚至没有合并)?

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

因此,我需要一种方法来编写不会丢失本地更改内容的更新脚本。我希望有一些简单的事情:

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

然后 git pull


更改是否已config.php提交?
Mark Longair


它没有提交。我宁愿不必
Johnny Everson,2012年

@JhonnyEverson:这是同一类问题(您有一个配置文件,并且您不想提交特定的设置,但是需要跟踪该配置文件的结构。)
Daenyth 2012年

Answers:


248

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

git stash
git pull
git stash pop

在隐藏存储中可能存在冲突。在您描述的情况下,实际上将存在冲突config.php。但是,解决冲突很容易,因为您知道存放在存储库中的就是您想要的。这样做:

git checkout --theirs -- config.php

5
git checkout --theirs命令非常混乱。它做到了我想要的,而另一次确实很糟糕。有任何好的文档吗?
Milimetric 2013年

3
是的,有时“他们的”和“我们的”可能会造成混淆。在git merge“我们的”目录中是当前工作目录中的目录。但是对于git rebase(或git rebase -onto),含义可以互换。
GoZoner 2013年

1
git stash , git pull , git stash apply 您可以使用以下方式放下存储空间:git stash drop成功合并更改后
BeingSuman's

11
git的作用是您必须了解它的作用。git的另一件事是,即使对于聪明的人,通常也很难理解git将要做什么。
布拉德·托马斯

1
您应该检查是否确实有什么东西可以藏起来。否则,您将弹出较早版本的隐藏更改git stash
约恩·赖默德斯18'Aug

15

如果您的存储库中有一个文件应该由大多数Pullers定制,则将文件重命名为,然后config.php.template添加config.php到中.gitignore


5
还要检查此答案,您可以用来.gitattributes在合并时始终保留所做的更改。
KurzedMetal,2012年

那更像是我所需要的。模板是一种优雅的解决方案,但是由于我只是在编写部署脚本,因此我恐怕无法使用它。
约翰尼·埃弗森

6

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

假如说:

  1. 你在树枝上 master
  2. 上游分支masterorigin
  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,则会将其丢弃。



1

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

1)在中.git/info/sparse-checkout,定义要保留的内容。在这里,我们需要所有(*),但(请注意感叹号)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 filter-branch)-创建删除文件的提交。这就像在一场艰苦的战斗中一样,但是,有时候,您必须忍受这一点。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.