Git:防止暂存某些文件,自动暂存所有文件

7
我希望能够取消当前工作副本中的所有暂存内容,但是自动暂存我将来编辑的所有文件和块。例如,我正在使用与项目中大多数其他人不同的CocoaPods版本。我想升级配置文件的配置以与我的CocoaPods兼容,而不破坏他们的配置。最简单的方法是不在拉取请求中包含新的配置,但这意味着我无法构建。存储和弹出无法解决问题,因为如果我在编辑配置后进行存储,然后应用我的更改,那么弹出将修复配置但撤消我的更改。我该如何解决这个问题?

1
我发现你的问题不太清楚。你想修改仓库中的文件,但在执行git add命令时不希望这些文件被添加到暂存区,是吗?使用.gitignore文件能解决你的问题吗? - Enrico
1
你考虑过使用清理过滤器吗?这样你可以在检出时应用自定义配置,但也可以确保你的自定义内容不会被提交。 - sschuberth
@VonC刚刚添加了一个基于我所提出的答案 :-) - sschuberth
@sschuberth 我同意。这看起来像是内容过滤驱动程序的工作。 - VonC
这是我一段时间前提出的类似问题:https://dev59.com/NWQn5IYBdhLWcg3wvpUV - Kevin
3个回答

3
一种方法是以一种仅在本地对您可见的方式修改配置文件。
但同时保持对该存储库的其他用户不可见。
如果这些修改是明确定义的(而不是散落在your.config.file中),则可以考虑使用内容过滤驱动程序,以便在检出时为该配置文件生成正确的内容: 在本地repo的根文件夹中编辑或创建.gitattributes文件,并在其中添加上述行。您可以将该文件添加、提交和推送:它不会对其他用户产生任何影响。 smudge
(图片来自“自定义Git - Git属性”,出自“Pro Git书籍”)
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来说,配置文件在外观上似乎从未更改。

1
你的回答非常不清楚,提到了updateconfigupdate_config两个不同的东西,并且有两种不同的设置方式。请提供更清晰的逐步说明(我不熟悉.gitattributes)。 - Coder-256
@Coder256 我已经更改了updateconfig属性设置名称,以避免混淆。它是与您的配置文件相关联的配置名称,以便关联2个过滤驱动程序:一个用于注入您的修改,另一个用于恢复其原始内容。 - VonC
@Coder256 你需要同时拥有.gitattributes文件和两个git config filter命令才能激活该过滤器,并且你需要编写两个bash脚本,一个将原始内容保存到saved_copy文件中并添加修改,另一个将恢复其内容(一行代码:cat saved_copy)。 - VonC

2

我使用的一种策略是使用两个分支:一个公共分支和一个永远不离开你的机器并包含你的配置更改的第二个分支。

在进行开发时,你需要将私有分支检出,但不提交。一旦你对更改感到满意,你需要将它们存储起来,检出公共分支,执行git 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

正如你所见,没有任何公共提交依赖于您对配置的本地更改,使公共历史记录不受您的配置更改的影响。然而,您的配置更改完全经过版本控制,因此您可以回到任何一个合并提交,并知道您将能够构建。

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


2
看起来需要使用assume-unchanged命令来解决。
git update-index --assume-unchanged <file>

这将防止您的更改被暂存和提交。
git update-index --no-assume-unchanged <file>

恢复回正常状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接