场景:
- 为您自己的本地计算机特定的详细信息更新web.config[git显示web.config已更改]
- 更新索引以假定未更改:
git update-index --assume-unchanged web.config
[git显示web.config未更改] - 暂停/做工作/放弃等
- 对需要提交的web.config进行更改,与上述更改无关[git显示未更改]**理想情况下,git可以显示与我们绝对不想要的更改不同的更改
对于第一步,是否有一种方法可以将您不希望的更改签入到索引中,从而表明就初始环境设置的git而言,web.config没有更改。类似git update-index --ignored-update web.config
接下来,在步骤4中,让git-diff-web.config只显示刚刚签入索引的内容之间的差异,并让只显示diff和commit中的更改。
请注意,我知道git更新索引——假设不变和——跳过工作树,这两个选项都不适合这种情况。假设没有变化,跳过工作树不会看到步骤4中的变化。
而且,我知道这是一个交互式git作业,是的,我广泛使用它,然而,有两个问题。。。当使用"假设未更改"时,更改后的文件不再被检测为不同
我认为git没有那种粒度。
你能做的是:
更新git的索引以重新考虑更改,隐藏您的更改,应用您想要的更改,提交它,应用隐藏并再次考虑:
$ git update-index --no-assume-unchanged web.config
$ git stash
#apply and commit your changes
$ git stash pop
$ git update-index --assume-unchanged web.config
当我有一些不想提交的本地修改时,我用一个特定的名字保存在我的储藏室里。
恢复"假定未更改的标志">
$ git update-index --no-assume-unchanged web.config
现在你有了想要的和不想要的改变。您可以使用commit --patch/-p
:提交想要的
$ git commit -p web.config
这使您可以交互式地选择要提交的更改。提交之后,web.config
中只保留您不打算保留的更改。
如果一些想要的和不想要的更改很接近(在同一块中),您可以在交互提交期间使用s
命令(将块拆分为更小的)。对于过于接近的某些更改,无法执行此操作。在这种情况下,分离更改需要手动操作。(这是一个很好的例子,可以在进行过程中进行大量的小提交,而不是允许不相关的更改累积。)
根据您不希望签入的更改的性质,"clean"one_answers"smooth"过滤器可能是一个不错的选择。这些过滤器可以在签出时以任意方式转换文件(例如,将用户名和密码插入数据库配置文件),并在将其添加到索引时以不同的方式再次转换(例如,用伪占位符替换真实的用户名和密码)。
例如:
# configure the clean/smudge filters
git config filter.userpass.clean
"sed -e 's/^user:.*/user: @USER@/' -e 's/^pass:.*/pass: @PASS@/'"
git config filter.userpass.smudge
"sed -e 's/^user:.*/user: myuser/' -e 's/^pass:.*/pass: mypass/'"
echo "/web.config filter=userpass" >>.git/info/attributes
# create web.config
cat <<EOF >web.config
user: foo
pass: bar
EOF
git add web.config
# make sure the clean filter works. notice that it shows @USER@ and
# @PASS@, not foo and bar
git diff --cached
# make sure the smudge filter works too
rm web.config
git checkout web.config
cat web.config # it should show myuser and mypass
或者,您可以关闭假定的未绑定位,并执行git add -p
来对web.config
进行部分编辑,但不是全部编辑。