我想取消暂存当前工作副本中的所有内容,但会自动暂存我将来编辑的所有文件和块。
例如,在我正在从事的项目中,我使用的 CocoaPods 版本与大多数其他人不同。我想升级配置文件的配置以与我的 CocoaPods 兼容,而不会破坏他们的。最简单的方法是不在拉取请求中包含新配置,但这意味着我无法构建。存储和弹出将不起作用,因为如果我在编辑配置后存储然后应用我的更改,弹出将修复配置但撤消我的更改。
我应该如何解决这个问题?
一种方法是以只有您在本地可见的方式修改该配置文件。
但是对于该回购的其他用户来说,这种方式仍然是不可见的。
如果这些修改定义明确(而不是全部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_config
andrestore_config
脚本可以在您本地的任何地方$PATH
(它们在 bash 中,即使您在 Windows 上,因为它们将由 mingw git bash 执行)。
该update_config
脚本将:
这样,git pull
触发工作树更新的 a 将使用所需的本地修改自动重新生成配置文件内容。
并且restore_config
脚本将在 git 调用时恢复文件的保存副本(例如,它将由 agit status
或 a触发git diff
):
cat saved_copy
这样,就 git 而言,配置文件似乎永远不会改变。
我一直在使用的一个策略是使用两个分支:一个是公共的分支,另一个是永远不会离开您的机器并包含您的配置更改的分支。
当您进行开发时,您会签出您的私有分支,但您不承诺它。一旦您对更改感到满意,您就可以将它们存储起来,签出公共分支,执行 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
如您所见,任何公共提交都不依赖于您对配置的本地更改,从而保持公共历史记录中的配置更改干净。但是,您的配置更改完全受版本控制,因此您可以返回任何合并提交并知道您将能够构建。
当然,这样做的代价是不断更换分支机构的麻烦。所以我会尽可能避免这样的结构,但在某些情况下它可能会有所帮助。