我希望能够取消当前工作副本中的所有暂存内容,但是自动暂存我将来编辑的所有文件和块。例如,我正在使用与项目中大多数其他人不同的CocoaPods版本。我想升级配置文件的配置以与我的CocoaPods兼容,而不破坏他们的配置。最简单的方法是不在拉取请求中包含新的配置,但这意味着我无法构建。存储和弹出无法解决问题,因为如果我在编辑配置后进行存储,然后应用我的更改,那么弹出将修复配置但撤消我的更改。我该如何解决这个问题?
your.config.file
中),则可以考虑使用内容过滤驱动程序,以便在检出时为该配置文件生成正确的内容:
add a smudge script associated to your.config.file
files in a .gitattributes
declaration:
your.config.file filter=filterconfig
.gitattributes
文件,并在其中添加上述行。您可以将该文件添加、提交和推送:它不会对其他用户产生任何影响。
cd /path/to/your/local/cloned/repo
git config filter.filterconfig.smudge 'update_config'
git config filter.filterconfig.clean 'restore_config'
update_config
和 restore_config
脚本可以放在本地的任何 $PATH
目录下(它们是 bash 脚本,即使你在 Windows 上,因为它们将由 mingw git bash 执行)。
update_config
脚本会:
这样,触发工作树更新的 git pull
将自动使用所需的本地修改重新生成配置文件内容。
restore_config
脚本会在 git 调用它时恢复文件的保存副本(例如,它将被触发通过 git status
或 git diff
):
cat saved_copy
updateconfig
和update_config
两个不同的东西,并且有两种不同的设置方式。请提供更清晰的逐步说明(我不熟悉.gitattributes
)。 - Coder-256git config filter
命令才能激活该过滤器,并且你需要编写两个bash脚本,一个将原始内容保存到saved_copy
文件中并添加修改,另一个将恢复其内容(一行代码:cat saved_copy
)。 - VonC我使用的一种策略是使用两个分支:一个公共分支和一个永远不离开你的机器并包含你的配置更改的第二个分支。
在进行开发时,你需要将私有分支检出,但不提交。一旦你对更改感到满意,你需要将它们存储起来,检出公共分支,执行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) commit 3
* commit 2
* commit 1
* some base commit
正如你所见,没有任何公共提交依赖于您对配置的本地更改,使公共历史记录不受您的配置更改的影响。然而,您的配置更改完全经过版本控制,因此您可以回到任何一个合并提交,并知道您将能够构建。
当然,这样做的代价是不断更改分支的麻烦。因此,我会尽量避免这种结构,但在某些情况下它可能会有所帮助。
git update-index --assume-unchanged <file>
git update-index --no-assume-unchanged <file>
恢复回正常状态。
git add
命令时不希望这些文件被添加到暂存区,是吗?使用.gitignore
文件能解决你的问题吗? - Enrico