Git one-liner для применения патча в интерактивном режиме

У меня есть этот файл патча, он содержит кучу модификаций, которые я хотел бы применить к ветке git. Но я не хочу делать один уникальный коммит со всеми этими модификациями, вместо этого я бы хотел разделить его на 2 или 3 коммита.

Я знаю, что могу добиться этого, сначала применив патч, а затем выполнив интерактивное добавление (hunk by hunk), вот так:

git apply mypatch
git add -p

Мне просто интересно, возможно ли это сделать одной командой git. Я ничего не нашел на страницах git applyни в git add,

РЕДАКТИРОВАТЬ

Я не думаю, что этот вопрос следует рассматривать как дубликат синтаксиса для псевдонимов Git с несколькими командами, поскольку этот вопрос (и его ответ) не нуждается в том, чтобы не включать параметр, переданный псевдониму.

3 ответа

Решение

Я отвечаю на свой вопрос, благодаря комментарию @8bittree.

Есть как минимум 2 способа сделать это:

  • используя функцию оболочки ( см. ответ 8bittree)
  • используя псевдоним git. Я предпочитаю это решение, так как оно включает только .gitconfigнет необходимости изменять .bashrcи завершение оболочки git работает для нового псевдонима, оно отображается вместе с другими стандартными командами git в списке завершения

Так что это то, что я закончил, чтобы добавить в мой глобальный .gitconfig:

[alias]
    # interactive apply patch
    ipatch = "!f() { git apply $1; git add -p; }; f"

Я тогда просто должен сделать:

git ipatch mypatchfile

Как упоминалось в моем комментарии, вы можете получить аналогичный эффект с помощью функции. После некоторых размышлений я не уверен, что псевдоним будет работать, так как вам нужно указать файл исправления и, возможно, некоторые параметры. Вот пример функции, которую вы можете добавить в свой.bashrc, вам, возможно, придется настроить ее, если вы используете оболочку, отличную от Bash. Я думаю, что это должно работать с Zsh, и, возможно, Ksh, но я не проверял это с ними.

function git() {
    # Allows you to call `git ipatch patchfile`
    # Change ipatch to whatever you want the git command to be
    if [[ "$1" = ipatch ]]; then
        shift
        # Specify the full path to git, otherwise infinite recursion
        # Alternatively, name the function something else
        /usr/bin/git apply "$@"
        /usr/bin/git add -p
    else
        /usr/bin/git "$@"
    fi
}

Если вы хотите добавить больше пользовательских команд git, возможно, стоит case заявление, а не длинная цепочка ifs.

Вы можете использовать unix команду "patch" (отдельно от git). Таким образом, Git ничего не узнает о патче - Git просто подумает, что вы регулярно редактировали. Вывод "git show" и "git diff" совместим с командой unix "patch":

# assuming "my-git-repo" is clean...
cd my-git-repo
patch -p1 < my.patch
git status

На этом этапе вы можете использовать "git add" / "git commit" для создания желаемой последовательности коммитов.

Другие вопросы по тегам