在git中,如何在进行您永远不想要提交的更改后记录对文件的更改

时间:2015-04-15 18:09:42

标签: git

场景:

  1. 更新web.config以获取您自己的本地计算机特定详细信息。 [git显示web.config已更改]
  2. 更新索引以假设未更改:git update-index --assume-unchanged web.config [git显示未触及的web.config]
  3. 暂停/做工作/劈开等等。
  4. 对需要提交的web.config进行更改,与上述更改无关。 [git显示未更改] **理想情况下,git可以显示与我们绝对不想要的更改不同的更改。
  5. 第一步,是否有办法将您不想要的更改签入到索引中,从而表明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工作,是的,我广泛使用它,但是,有两个问题...当使用假设未更改时,更改的文件是否检测到的时间越长越好。

3 个答案:

答案 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命令(将块分成较小的块)。对于靠近在一起的某些更改,无法执行此操作。在这种情况下,分离变更涉及手工工作。 (这是一个很好的例子,可以在你继续进行许多小提交而不是允许不相关的更改累积。)