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_config
和 restore_config
脚本可以在本地 $PATH
的任何位置(它们在 bash,即使您在 Windows,因为它们将由 mingw git bash).
执行
update_config
脚本将:
- 制作配置文件的初始副本,
- 将其修改注入配置文件。
这样,触发工作树更新的 git pull
将自动重新生成具有所需本地修改的配置文件内容。
并且 restore_config
脚本会在被 git 调用时恢复保存的文件副本(它会被 git status
或 git 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 历史记录清洁您的配置更改。但是,您的配置更改完全受版本控制,因此您可以返回到任何合并提交并知道您将能够构建。
这样做的代价当然是不断更换分支的麻烦。所以我会尽可能避免这样的构造,但在某些情况下它会有所帮助。
我想取消暂存我当前工作副本中的所有内容,但自动暂存我将来编辑的所有文件 和 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_config
和 restore_config
脚本可以在本地 $PATH
的任何位置(它们在 bash,即使您在 Windows,因为它们将由 mingw git bash).
update_config
脚本将:
- 制作配置文件的初始副本,
- 将其修改注入配置文件。
这样,触发工作树更新的 git pull
将自动重新生成具有所需本地修改的配置文件内容。
并且 restore_config
脚本会在被 git 调用时恢复保存的文件副本(它会被 git status
或 git 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 历史记录清洁您的配置更改。但是,您的配置更改完全受版本控制,因此您可以返回到任何合并提交并知道您将能够构建。
这样做的代价当然是不断更换分支的麻烦。所以我会尽可能避免这样的构造,但在某些情况下它会有所帮助。