2012-04-04 4 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 вообще не устраивается.

Как я могу обновить B в индексе (этап его нестационарных изменений) без добавления C?

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

Может вы покажете реальный случай использования, где вы хотите это сделать? Я не могу себе представить (когда я добавляю файл и чем его больше модифицирую, это автоматически не означает, что я тоже хочу добавить эти изменения, особенно когда я не хочу добавлять изменения в некоторые другие файлы). –

+0

@JanHudec Мне, вероятно, это не понадобится, если бы я был более строгим и касался только тех файлов, которые должны были бы совершать commit ('B'). Однако иногда я увлекаюсь и начинаю вносить изменения, которые должны быть в новой фиксации ('C'), поэтому я добавляю« B »в индекс. Перед тем, как совершать, я всегда просматриваю diff -cached и иногда чищу что-то в 'B'. и тогда мне это нужно. Я предполагаю, что это, вероятно, можно было бы решить по-другому, скажем, с помощью stash – axelarge

+0

Моя точка зрения заключается в том, что когда вы делаете что-то в файле 'X', которое должно идти в commit' B' и увлекаться и делать изменения, которые должны выполняться в commit 'C', некоторые из этих изменений часто снова появляются в файле' X'. В этом случае вы хотите вручную добавить отдельные ханки, а не просто добавить файл 'X'. Очевидно, что если вы увлекаетесь, вы, вероятно, заметили что-то вокруг того, что вы меняете, поэтому маловероятно, что дополнительные изменения не касаются файлов, которые делает кулак. –

ответ

22

Следующая команда обновит индекс, чтобы содержать другие изменения в B, которые не были поставлены еще:

git update-index --again 
+1

А, лучше, чем мой метод! – torek

+0

Отлично! Это именно то, что мне нужно – axelarge

1

я не знаю совершенно тривиальный способ сделать это, но:

git status --porcelain 

покажет файл B (и только B) в состояние "ММ", так:

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

создаст список таких файлов.

В «повторном добавлении» нет никакого вреда.

Вы также можете использовать git diff-index --cached --name-status HEAD. (Может это понадобится, если ваш мерзавец слишком стар, чтобы иметь git status --porcelain.)

+0

Спасибо, я не знал о --porcelain для статуса. – axelarge

+0

В настоящее время это то же самое, что и -s/--short, но обещает продолжать машинный анализ, что важно, если вы придерживаетесь его в каком-то скрипте. :-) – torek

+0

Я попробовал git status --porcelain | grep^[AM] M | cut -d '' -f 2- | xargs git add', но он терпит неудачу с именами файлов, которые содержат пробелы.Думаю, это можно рассматривать как еще один вопрос, но, может быть, вы можете помочь? С xargs -0 он вообще не работает – axelarge

 Смежные вопросы

  • Нет связанных вопросов^_^