6

我想取消暂存当前工作副本中的所有内容,但会自动暂存我将来编辑的所有文件和块。

例如,在我正在从事的项目中,我使用的 CocoaPods 版本与大多数其他人不同。我想升级配置文件的配置以与我的 CocoaPods 兼容,而不会破坏他们的。最简单的方法是不在拉取请求中包含新配置,但这意味着我无法构建。存储和弹出将不起作用,因为如果我在编辑配置后存储然后应用我的更改,弹出将修复配置但撤消我的更改。

我应该如何解决这个问题?

4

2 回答 2

3

一种方法是以只有您在本地可见的方式修改该配置文件。
但是对于该回购的其他用户来说,这种方式仍然是不可见的。

如果这些修改定义明确(而不是全部your.config.file),那么您可以考虑使用内容过滤器驱动程序,以便在结帐时为该配置文件生成正确的内容:

  • 在声明your.config.file中添加与文件关联的涂抹脚本:.gitattributes

    your.config.file filter=filterconfig
    

(在本地 repo 的根文件夹中编辑或创建一个.gitattributes文件,并在其中添加上面的行。您可以添加、提交和推送该文件:它不会对其他用户产生任何影响)。

弄脏
(图片来自“ Customizing Git - Git Attributes ”,来自“ Pro Git book ”)

cd /path/to/your/local/cloned/repo
git config filter.filterconfig.smudge 'update_config'
git config filter.filterconfig.clean 'restore_config'

update_configandrestore_config脚本可以在您本地的任何地方$PATH(它们在 bash 中,即使您在 Windows 上,因为它们将由 mingw git bash 执行)。

update_config脚本将:

  • 制作配置文件的初始副本,
  • 在配置文件中注入其修改。

这样,git pull触发工作树更新的 a 将使用所需的本地修改自动重新生成配置文件内容。

并且restore_config脚本将在 git 调用时恢复文件的保存副本(例如,它将由 agit status或 a触发git diff):

cat saved_copy

这样,就 git 而言,配置文件似乎永远不会改变。

于 2016-04-16T19:56:00.993 回答
2

我一直在使用的一个策略是使用两个分支:一个是公共的分支,另一个是永远不会离开您的机器并包含您的配置更改的分支。

当您进行开发时,您会签出您的私有分支,但您不承诺它。一旦您对更改感到满意,您就可以将它们存储起来,签出公共分支,执行 agit stash pop并提交结果。之后,您返回您的私有分支并合并您的新提交。生成的历史将如下所示:

*   (HEAD->private) merge
|\
| * (public) commit 3
* | merge
|\|
| * commit 2
* | a change in your local configuration
* | merge
|\|
| * commit 1
* | some private configuration changes
 \|
  * some base commit

现在,如果你绘制public分支的历史,你会得到:

* (public) commit 3
* commit 2
* commit 1
* some base commit

如您所见,任何公共提交都不依赖于您对配置的本地更改,从而保持公共历史记录中的配置更改干净。但是,您的配置更改完全受版本控制,因此您可以返回任何合并提交并知道您将能够构建。

当然,这样做的代价是不断更换分支机构的麻烦。所以我会尽可能避免这样的结构,但在某些情况下它可能会有所帮助。

于 2016-04-16T20:02:48.880 回答