场景:
git update-index --assume-unchanged web.config
[git显示未触及的web.config] 第一步,是否有办法将您不想要的更改签入到索引中,从而表明web.config没有改变,因为git与初始环境设置有关。像git update-index --ignored-update web.config
接下来,在第4步,让git diff web.config只显示刚刚检入索引的内容之间的区别,并且只有那些更改显示在diff和commit中。
请注意,我知道git update-index --assume-unchanged和--skip-worktree,这两个选项都不适合这个场景。假设未更改且skip-worktree将不会在步骤4中看到更改。
而且,我知道这是一个交互式git工作,是的,我广泛使用它,但是,有两个问题...当使用假设未更改时,更改的文件是否检测到的时间越长越好。
答案 0 :(得分:1)
我相信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
当我进行一些我不想提交的本地修改时,我保留了一个特定名称的藏匿处。
答案 1 :(得分:0)
根据您不希望签到的更改的性质,"clean" and "smudge" filters可能是一个不错的选择。这些过滤器可以在结账时以任意方式转换文件(例如,将用户名和密码插入数据库配置文件中),并在将其添加到索引时以不同的方式再次转换它(例如,用以下内容替换真实的用户名和密码虚拟占位符)。
例如:
# 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
但不是全部。
答案 2 :(得分:0)
恢复“假设未改变的旗帜”
$ git update-index --no-assume-unchanged web.config
现在,您有各种需要和不需要的更改。您可以使用commit --patch/-p
:
$ git commit -p web.config
这使您可以以交互方式选择要提交的更改。在提交之后,只有更改保留在您不打算保留的web.config
中。
如果某些有用和不需要的更改靠近在一起(在同一个块中),您可以在交互式提交期间使用s
命令(将块分成较小的块)。对于太靠近在一起的某些更改,无法执行此操作。在这种情况下,分离变更涉及手工工作。 (这是一个很好的例子,可以在你继续进行许多小提交而不是允许不相关的更改累积。)