Шаги, которые вы наметили, в основном правильные.Опция --dir
может быть полезна, если вам нужно направить вывод, скажем, на общий диск.Опция --series
(-s
) полезна, если вы хотите импортировать весь набор патчей.Я часто использую это для инициализации рабочей копии stg git на новом компьютере:
# On Machine A (existing StGit repo with all patches applied)
$ stg export --dir /y/projects/ttc_dev_stg_patches/master
Checking for changes in the working directory ... done
# On Machine B ('pristine' StGit repo with no patches)
$ stg series [<-- should have no output!]
$ stg import -s /y/projects/ttc_dev_stg_patches/master/series
Checking for changes in the working directory ... done
Importing patch "remove-stl-at" ...
Invoking the editor: "vim .stgitmsg.txt" ... done
done
Importing patch "wldap32-fix" ...
Invoking the editor: "vim .stgitmsg.txt" ... done
done
Importing patch "cmake-fixes" ...
Invoking the editor: "vim .stgitmsg.txt" ... done
done
Now at patch "cmake-fixes"
Если вы не хотите импортировать каждый патч, вы можете указать их индивидуальнокак вы это сделали в своем примере.
Другая распространенная необходимость - синхронизировать исправления в нескольких рабочих копиях (возможно, на разных машинах).stg sync
- это команда, которая будет использоваться в этом случае:
# On Machine B (existing StGit repo)
$ stg series
+ remove-stl-at
+ wldap32-fix
> cmake-fixes
$ stg sync --all -s /y/projects/ttc_dev_stg_patches/master/series
Checking for changes in the working directory ... done
Popping patches "cmake-fixes" - "wldap32-fix" ... done
Synchronising "remove-stl-at" ... done (updated)
Fast-forwarded patch "wldap32-fix"
Synchronising "wldap32-fix" ... done
Fast-forwarded patch "cmake-fixes"
Synchronising "cmake-fixes" ... done (updated)
Что касается ошибки при попытке отменить ревизию, которая имеет более одного родителя: вы в основном не можете этого сделать.С справочной страницы stg-uncommit (1) :
Отмена может быть зафиксирована только с одним родителем;другими словами, вы не можете отменить слияние.
Это имеет смысл.Если история не является линейной, StGit не может узнать, какие родительские коммиты он должен использовать.В зависимости от ваших потребностей, возможный обходной путь может заключаться в создании временной ветви одного из родителей и выделении необходимых коммитов другого родителя.Это создаст линейную историю, которую вы затем можете запустить stg uncommit
, чтобы создать серию патчей.Это может быть хорошо, если вы просто пытаетесь сгенерировать набор патчей, который будет корректно применяться к некоторому конкретному снимку дерева исходного кода.Тем не менее, вы вполне можете столкнуться с проблемами при таком подходе, если вы делаете что-то более сложное, чем это.(Это сложная проблема; см. этот вопрос для более подробной информации.)