Зафиксируйте и автоматически добавьте все необработанные файлы

Я часто забывал, что у меня есть несколько новых файлов и прямо,

git commit -a -m "My commit message"

Это только фиксирует измененные файлы, и я должен добавить оставшиеся файлы в новый коммит. Это означает, что есть две отдельные фиксации, хотя логически они являются частью одной и той же задачи.

Самый простой способ, по которому я знаю, включать нефиксированные файлы в commit через две последовательные команды:

git add -A
git commit -a -m "My commit message"

Возможно ли иметь один и тот же эффект, как указано выше, в одной команде?

Ответ 1

Создайте файл в указанном пути выполнения (без расширения): git-add-commit-untracked

Поместите это в него:

#!/bin/bash
message=${0}
git add -A
git commit -am "$message"

Тогда: git-add-commit-untracked "Commit message"

Однако вы можете использовать более короткое имя для файла. Я оставил его длинным для иллюстративных целей.

Ответ 2

Вы можете определить псевдоним, чтобы добавить все до фиксации. Просто поместите эти строки в файл ~/.gitconfig:

[alias]
        ca = !sh -c 'git add -A && git commit -m \"$1\"' -

Затем используйте свой псевдоним следующим образом:

$ git ca 'Your commit message'

Ответ 3

Вот несколько вариантов:

  • Используйте git commit --amend, чтобы вы получили только одну фиксацию после добавления необработанных файлов (но не если вы уже нажали предыдущую фиксацию);
  • Используйте git commit --interactive;
  • Создайте псевдоним или script, который автоматически добавит новые файлы (примеры в других ответах). Вот два псевдонима, которые я использую именно для этой цели:

    [alias]
        untracked = ls-files --other --exclude-standard
        add-untracked = !git add $(git untracked)
    
  • Выполните сквош своих двух коммитов, используя git rebase -i, git reset <commit prior to first commit> и git commit, или git merge --squash в другую ветку.

Однако вы не можете переопределить встроенную команду, например commit, с псевдонимом, поэтому вам все равно не нужно добавлять файлы, которые вы хотите индексировать, прежде чем совершать.

К сожалению, вы не можете указывать пути вместе с git commit -a; Я просто попробовал git commit -a $(git untracked), и он сказал мне fatal: Paths with -a does not make sense. Чтобы ответить на ваш основной вопрос, я думаю, что git script будет единственным неинтерактивным способом.

Ответ 4

Невозможно использовать интерфейс git по умолчанию. Однако git поддерживает псевдонимы.

Используя псевдоним, можно вызвать другую команду git или даже запустить произвольные сценарии оболочки. Создайте script, содержащий две команды, и укажите его.

Смотрите вики для получения дополнительной информации о псевдонимах и этот вопрос для этот конкретный сценарий.

Изменить: обратите внимание, что это не такая хорошая идея. Вероятно, вы в конечном итоге добавляете ненужные файлы по ошибке или имеете бесполезный псевдоним из-за не-версий файлов в дереве.

Ответ 5

Да, у меня была такая же проблема, как и вы в прошлом. Я предпочитал использовать команду git, но у меня возникли большие проблемы, потому что охранник в рельсах менял много файлов без предупреждения:)

Итак, всякий раз, когда я совершаю новый код, я пытаюсь использовать UI для этого (git gui) и не забывайте использовать git commit -a, потому что вы не знаете, какие файлы были изменены! После перезагрузки нового кода, пожалуйста, gitk, чтобы просмотреть дерево git, чтобы вы могли узнать о последних обязательствах, коммиттерах, файлах фиксации и т.д.