如何导入树外的git历史记录

时间:2016-09-13 17:29:23

标签: linux git linux-kernel

我的问题的介绍不会过多谈论git,但我希望这仍然会为我的问题带来更多的亮点(最后要求一个git解决方案)比我掩饰幕后的现实用例。

引言

在Linux内核中,通常情况是某个特殊驱动程序的某个供应商决定将其保留在内核树之外(不会提供真实示例)。这意味着驱动程序是在一个单独的存储库中开发的,它是针对某些特定内核源构建的树外(没问题,Kbuild系统允许这样做)。这意味着一些客户收到该驱动程序,并且还需要在树外构建它。

现在,在从不同供应商处收到的大量此类模块中,跟踪它们真的很麻烦,因为它们必须与树内核模块分开构建,而且还需要单独构建。此外,在构建操作期间,树外模块无法链接到内核映像中。

因此,客户可能会决定将树外的东西带回到内核树中,这只是为了简化构建过程。当然,包含导入模块的存储库不会暴露给外部世界,并且用于容纳这些模块的Kbuild基础架构不是主线的目标。

实际GIT问题

以下是问题:

  • 有人遇到过类似的问题吗?
  • git允许" cherry-picking"来自完全不同的存储库?

假设导入内容的文件结构与原始存储库相比,无需在目标存储库中更改。

2 个答案:

答案 0 :(得分:1)

取决于将来如何维护。假设我们有原始内核树( torvalds ),您自己的东西,以及驱动程序或模块供应商 A B C 。我们还假设供应商对内核开发过程并不熟悉,他们的树只是模块源代码的树,没有别的。

考虑一个最简单的案例。您有需要的东西来应用您的补丁。你是怎么做到的?

  1. 初始阶段:

    % git clone git://git.example1.com/software.git
    % cd software
    % git checkout -b mysoftware origin/master
    
  2. 开发你的东西:

    % vim lib/mynewlib.c
    % git add lib/mynewlib.c
    % git commit -s -m "lib/mylib: Implement feature Z"
    
  3. 维护阶段:

    % git checkout mysoftware
    % git remote update
    % git rebase --onto origin/master <HASH_OF_PREVIOUS_MASTER_HEAD>
    
  4. 摘要:在这里,您的提交始终位于最新鲜的 origin / master 之上。

    现在,请附加一些第三方供应商:

        % git remote add supplier git://git.example2.com/module.git
    

    这意味着Git支持没有共同历史的异构遥控器。

    摘要:此处您将拥有原产地供应商遥控器,请与git remote -v一起检查

    使用当前设置,您可以维护不同分支中的每个软件。

    你可以做一些合并准备,例如:

        % git checkout -b mymodule supplier/master
        % mkdir drivers/staging
        % git mv <MODULE_FILES_AND_FOLDERS> drivers/staging
        % git commit -a -s -m "module: move to proper location in main tree"
    

    替代方法是使用git merge --strategy=subtree ...而不是在下面执行这些命令和简单合并。

    摘要:在这里,您将模块文件和文件夹移动到主树中的正确位置。

    合并到主树

        % git checkout -b mysoftware+module mysoftware
        % git merge mymodule
        % vim drivers/staging/Kconfig
        % vim drivers/staging/Makefile
        % git add drivers/staging{Kconfig,Makefile}
        % git commit -s -m "Enable mymodule compilation"
    

    摘要:在这里,您将合并树并准备编译。

    何时需要更新mymodule和mysoftware:

        % git remote update
        % git checkout mysoftware
        % git rebase --onto origin/master <HASH_OF_PREVIOUS_MASTER_HEAD>
        % git checkout mymodule
        % git rebase --onto supplier/master <HASH_OF_PREVIOUS_SUPPLIER_MASTER_HEAD>
        % git branch -D mysoftware+mymodule
        % git checkout -b mysoftware+mymodule mysoftware
        % git merge mymodule
    

    现在,您可以使用 A B C torvalds 轻松将其扩展为方案。

答案 1 :(得分:-1)

要将文件从其他存储库中获取到当前存储库,您可以使用

1)git fetch从另一个存储库中的所需分支获取文件

2)git show或git checkout将文件从分支拉到工作树

3)git clear(!)以后删除它们(以及所有其他未跟踪的文件!)