Git 假设未更改,但仅在下一次更改之前

Git 假设未更改,但仅在下一次更改之前,git,Git,我如何告诉git忽略当前对文件foobar所做的修改,而不忽略将来的任何修改 我在我的工作树中有一个文件,我对该文件做了一个小更改,但我不想再提交给它。我可以使用git更新索引——假设foobar未更改,但git将忽略对该文件所做的任何其他更改 我想告诉git只忽略对foobar的当前修改,如果它以任何其他方式发生了更改,请警告我 因此,考虑到更新索引——假设unchanged在这种情况下不适用,是否有另一种方法告诉git,只要它具有当前内容或当前mtime,就将foobar视为未更改 文件在两

我如何告诉git忽略当前对文件
foobar
所做的修改,而不忽略将来的任何修改

我在我的工作树中有一个文件,我对该文件做了一个小更改,但我不想再提交给它。我可以使用
git更新索引——假设foobar未更改,但git将忽略对该文件所做的任何其他更改

我想告诉git只忽略对
foobar
的当前修改,如果它以任何其他方式发生了更改,请警告我

因此,考虑到
更新索引——假设unchanged
在这种情况下不适用,是否有另一种方法告诉git,只要它具有当前内容或当前
mtime
,就将
foobar
视为未更改


文件在两台计算机之间共享;它正在被一个旧版本的应用程序更改,该应用程序删除了由新版本创建的、它不理解的配置密钥

那么,最好不要对该文件进行任何版本设置,而是使用以下版本:

  • 该文件的模板
  • 2个值文件(每台计算机一个)
  • 能够生成最终文件(将保持私有)的脚本
  • 一个
    .gitignore
    来声明一个,一个污迹脚本,它将在签出时自动触发该脚本并生成具有正确值的正确配置文件,检测它在哪台计算机上运行

(来自“”的图像来自)

如何让git忽略当前对文件所做的修改 foobar,但不是未来的任何修改

如果您将“忽略”概念放在比低级别存储在索引和存储库级别更高的级别上,那么您将获得更高的灵活性,并且只需稍微调整您的工作流程

假设我正在开发我最棒的新hello world程序,但我需要在开发过程中添加一些调试,而这不是我想成为最终交付的一部分。在这种情况下,我所做的只是将该更改作为一个普通的提交进行检入,但要以一种特殊的方式对其进行标记,即在提交消息的前面和后面加上一个明显区别于其他提交消息的字符串

当我稍后想要完成工作时,我只是过滤掉所有临时提交的内容

$ git checkout -b deliver work
Switched to a new branch 'deliver'
$ git rebase -i master
然后,通过对提交消息的特殊标记,可以轻松查看要删除的提交:

pick fdbd12a Mininmal main.c
pick 21e3d6f hello world with arg support
pick a62ebac ========= DEBUG: print argc ========
pick 3160605 Use EXIT_SUCCESS
pick 0ec0ac6 constify message

# Rebase 8ce6878..0ec0ac6 onto 8ce6878
...
这就给了我一个干净的传送分支:

我可以将其合并到我想要交付给的任何分支


例如,在您的情况下,您可以使用新的配置键签入更改

git add yourfile
git commit -m "======== NEW CONFIG KEYS ========"
然后在交付时过滤掉提交,或者可能有一个单独的分支来处理,其中提交是唯一的区别。例如

git checkout -b computer_new computer_old
git add yourfile
git commit -m "======== NEW CONFIG KEYS ========"
# do some work
git commit -am "some work 1"
git commit -am "some work 2"
git commit -am "some work 3"
# Rebase to put "NEW CONFIG KEYS" as the newest commit
git rebase -i computer_old

pick xxxxx ======== NEW CONFIG KEYS ========
pick xxxxx some work 1
pick xxxxx some work 2
pick xxxxx some work 3

然后将这些新工作合并回旧计算机

git checkout computer_old
git merge computer_new^

(branch^表示比branch上的最新提交早一次提交,例如,合并直到包括“some work 3”提交)。

普通git可能不可能这样做,因为您需要将旧版本存储在某个地方(只能在索引中),但您不想提交它。问题是,
git commit
只是将整个索引写入存储库。但我可能错了。git将当前的
mtime
记录为索引版本的
mtime
就足够了,这样git只有在某些应用程序更改它时才会再次检查它。这不是完全可以证明未来的,但已经足够好了。我怀疑你能做到,你必须建立一些东西来做到这一点。我认为这在Git工作流程的任何正常部分都没有考虑。通常,您应该更清楚回购协议中的更改,我不知道您为什么要隐藏文件正在更改的事实;它正在被一个旧版本的应用程序更改,该应用程序删除了由新版本创建的配置键,但它无法理解。@meagar:
git status
已经使用
mtime
来理解是否应该更深入地检查文件。如果当前的
mtime
与存储的时间相等(在哪里?),则假定该时间不变。c、 f.
更新索引的手册页
git checkout computer_old
git merge computer_new^