3

我们在 repo 中有一个配置文件,所有用户都根据他们的功能做出贡献。对于我的本地测试,我需要手动更改该配置文件中的两个值,但我不希望我的更改提交回服务器。

但是,如果 repo 中有更新的版本,我确实想拉取文件的更新,即使这意味着我的本地更改将被覆盖。没关系,我可以从我专门为做到这一点而创建的藏匿处再次制作它们。

我想知道的是我是否可以告诉 Git “嘿......我永远不会将我的本地更改推回服务器,所以不要向我显示它已更改,但如果有新的更改要给我,让我知道我拉的时候他们!”

这是我所追求的一个例子。

Server: VersionA
Local:  [Nothing]

(I do a Git Pull)

Server: VersionA
Local:  VersionA

(I make local changes)

Server: VersionA
Local:  VersionA (Modified)

(What I want...)

Server: VersionA
Local:  VersionA (Modified, but ignored locally by Git)

(Someone checks in an update to the file)    

Server: VersionB
Local:  VersionA (Modified, but local changes ignored by Git)

(I do a git Pull)

Server: VersionB
Local:  VersionB (This overwrites my local, modified VersionA)

(I then manually update VersionB with my stashed changes)

Server: VersionB
Local:  VersionB (modified, but local changes ignored by Git)

.gitignore文件不适用于此处,因为这会阻止添加新文件,但同样,该文件被添加。我只是希望它始终忽略我的本地更改,就好像它们不存在一样。我只关心服务器上的文件是否已更改。

那么可以将 Git 配置为执行此操作吗?

4

1 回答 1

0

.gitignore文件不适用于此处,因为这会阻止添加新文件,但同样,该文件被添加。
我只是希望它始终忽略我的本地更改。

另一种方法是进行修改......在一个私人文件中,一个不被跟踪和被忽略的文件。

这意味着所有共同的贡献都在模板文件中完成,用于生成实际文件(作为私有非版本控制文件,添加到您的.gitignore.

那一代将是自动的git checkout

首先,重命名现有文件:

git mv aConfigFile aConfigFile.tpl
git commit -m "record template config file"

然后添加到aConfigFile文件.gitignore中:agit status将不再显示它以进行添加/更改。

现在,声明一个涂抹内容过滤器驱动程序,它会自动重新生成该文件(忽略,因为它在.gitignore

https://git-scm.com/book/en/v2/images/smudge.png
(图片来自“ Customizing Git - Git Attributes ”,来自“ Pro Git book ”)

smudge脚本(你可以版本):YourScript

copy aConfigFile.tpl aConfigFile

在 versioned 中声明内容过滤器驱动程序.gitattributes

echo 'aConfigFile.tpl config' >> .gitattributes

每个克隆该存储库的用户都需要在本地激活该涂抹“配置”内容过滤器驱动程序。

cd /path/to/repo
git config filter.config.smudge YourScript

最后一步是每个用户唯一需要做的,以便从每个git checkout.

对生成的文件所做的任何修改都将保留在本地。

于 2018-08-05T23:01:31.833 回答