2012-04-04 46 views
17

在git中,是否有任何(简单)的方式来修改索引,以便只添加已经在其中的文件的更改?这听起来很复杂,但我想实现的很简单。刷新分段文件

比方说我的指数看起来像这样(略剥离git status输出):

# Changes to be committed: 
#  modified: A 
#  modified: B 
# 
# Changed but not updated: 
#  modified: B 
#  modified: C 
# 
# Untracked files: 
#  D 

一些变化B在索引中,有些则不是。 C根本没有上演。

如何在不添加C的情况下更新索引中的B(阶段未分级更改)?

I.e.我想该指数将是这样的:

# Changes to be committed: 
#  modified: A 
#  modified: B 
# 
# Changed but not updated: 
#  modified: C 
# 
# Untracked files: 
#  D 

在它当然可以用一个简单的git add B实现这个简单的例子,但我想知道是否有针对一般情况下一个简单的答案。我试过git add --refresh,但是如果我理解正确,那只会更新统计信息。

+0

你能告诉一个真正的用例你想这么做?我无法想象任何(当我添加一个文件,而不是更改它时,它并不意味着我会想要添加这些更改,特别是当我不想在其他文件中添加更改时)。 – 2012-04-04 08:34:32

+0

@JanHudec我可能不会需要这个,如果我更严格,只接触那些应该在提交('B')中进行的文件。然而,有时候我会被带走并开始进行新的提交('C')的更改,所以我在索引中添加了'B'。在提交之前,我总是检查diff - 缓存,有时候会用'B'清理一些东西。那时候我需要这个。我想这可能可以通过另一种方式解决,比如隐藏 – axelarge 2012-04-04 09:09:35

+0

我的观点是,当你正在执行文件'X'中的某些内容时,应该提交'B'并将其带走并做出应该提交的更改'C',其中一些变化通常是再次提交'X'。在这种情况下,您想要手动添加-i个人区块,而不是仅添加文件“X”。显然,如果你被带走了,你可能会注意到你正在改变的一点,这就是为什么额外的改变不会触及第一组文件所做的文件。 – 2012-04-04 09:39:08

回答

22

以下命令将更新索引包含尚未上演然而在B中的其他变化:

git update-index --again 
+1

啊,比我的方法更好! – torek 2012-04-04 19:16:09

+0

完美!这正是我需要的 – axelarge 2012-04-05 08:33:03

1

我不知道的完全琐碎的方式来做到这一点,但:

git status --porcelain 

会显示文件B(只有B)作为国家 “MM”,所以:

git status --porcelain | grep ^MM | cut -d' ' -f 2 

将产生这样的文件的列表。

尽管如此,“重新添加”A没有任何坏处。您可以使用git diff-index --cached --name-status HEAD。 (可能需要这个,如果你的Git是太老了,git status --porcelain。)

+0

谢谢,我不知道 - 瓷器的状态。 – axelarge 2012-04-04 09:14:11

+0

它目前与-s/--short相同,但承诺会继续保持机器分析能力,如果将其粘贴到某个脚本中,这一点很重要。 :-) – torek 2012-04-04 09:28:04

+0

我试过'git status --porcelain | grep^[AM] M |切割-d''-f 2- | xargs git add',但它失败,文件名包含空格。我想这可能被视为另一个问题,但也许你可以帮忙?使用xargs -0它根本不起作用 – axelarge 2012-04-04 09:54:42