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
заявление, а не длинная цепочка if
s.
Вы можете использовать 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" для создания желаемой последовательности коммитов.