使用stgit和git补丁导入/导出

时间:2010-12-21 19:06:37

标签: git patch

我有git存储库A和git存储库B,我想通过使用stgit将一些补丁从repo A应用到repo B.

到目前为止,我的理解是我采取了以下措施:

$ stg clone smthA.git repoA
$ cd repoA
$ stgit uncommit --number=100
$ stgit export
$ cd ../../repoBdir
$ stgit import ../../repoA/patchdir/patch_name_1

任何人都可以确认我这是正确的程序吗?我错过了什么吗? 如何解决"Trying to uncommit .... which does not have exactly one parent"来自"$ stgit uncommit"的错误?

从这里做过的人那里学到了什么建议或教训?

1 个答案:

答案 0 :(得分:3)

您概述的步骤基本上是正确的。如果您需要将输出定向到共享驱动器,--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来创建修补程序系列。如果您只是尝试生成一个可以干净地应用于某个特定源树快照的补丁集,那么这可能没问题。但是,如果你做的事情比这复杂得多,你很可能会遇到这种方法的麻烦。 (这是一个难题;请参阅this question了解更多观点。)