Git: 防止暂存部分文件,自动暂存所有文件

Git: prevent staging some files, automatically stage all

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

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

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

一种方法是以只有您在本地可见的方式修改该配置文件。
但在某种程度上对该回购协议的其他用户来说是不可见的。

如果这些修改定义明确(而不是 your.config.file 中的所有地方),那么您可以考虑 content filter driver 以便在结帐时为该配置文件生成正确的内容:

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

    your.config.file filter=filterconfig
    

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


(图片来自“Customizing Git - Git Attributes", from "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_configrestore_config 脚本可以在本地 $PATH 的任何位置(它们在 bash,即使您在 Windows,因为它们将由 mingw git bash).

执行

update_config 脚本将:

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

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

并且 restore_config 脚本会在被 git 调用时恢复保存的文件副本(它会被 git statusgit diff 触发例如):

cat saved_copy

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

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

当你进行开发时,你检查了你的私人分支,但你没有承诺。一旦您对更改感到满意,您就可以将它们存储起来,检查 public 分支,执行 git stash pop,然后提交结果。之后,你 return 到你的私人分支并合并你的新提交。生成的历史记录将如下所示:

*   (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

如您所见,没有任何 public 提交依赖于您对配置的本地更改,保持 public 历史记录清洁您的配置更改。但是,您的配置更改完全受版本控制,因此您可以返回到任何合并提交并知道您将能够构建。

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