Короткий ответ - нет.
Более длинный ответ начинается с того факта, что вы должны как-то определить «открытые ветви», поскольку это не концепция Git.Ветвь name в Git - это просто метка, указывающая на один конкретный коммит.Ветвь часто (в зависимости от того, кто произносит слово) представляет собой неуказанную серию коммитов, которые достижимы из этого конкретного коммита, но иногда это имя ветви.
После того, как вы взялись за это, возможно, дело в малой важности: git for-each-ref
1 , чтобы получить список всех названий ветвей, отфильтровать его до того, что вы подразумеваете под словом "open", инаписать сценарий оболочки:
... если не считать сценария оболочки ...
Упс.: -)
Сам сценарий оболочки, как правило, довольно прост: он запускает git checkout
, чтобы переключиться на нужную ветвь, затем запускает либо git checkout <hash> -- <path> && git commit
, либо git merge <hash>
, с необходимыми дополнительными аргументами по желанию.Случай слияния должен учитывать, что делать в случае конфликта слияния, и требует, чтобы выбранный <hash>
был способен к слиянию для получения желаемого результата, а это действительно сложная часть: соответствующая<hash>
может варьироваться от одного имени ветки к следующему, и во всех случаях конкретный коммит должен быть создан до запуска скрипта.
(Вместо git checkout <hash> -- <path>
, вы также можете использовать cp /path/to/external/file <path> && git add <path>
, конечно.)
1 Не используйте ls .git/refs/heads
, так как это не обрабатывает несколько случаев, включая упакованные ссылки и веткичьи имена имеют вид feature/X
. Do помните, что git for-each-ref
необходимо пространство имен для итерации: базовое - refs/heads
, но более интересным может быть refs/remotes/origin
.Подробнее см. в документации .