Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将修补程序从一个git repo导入到另一个git repo_Git - Fatal编程技术网

将修补程序从一个git repo导入到另一个git repo

将修补程序从一个git repo导入到另一个git repo,git,Git,我有两个存储库,它们共享一些代码,但不是全部。有时我需要从一个存储库(上游)到另一个存储库(下游)选择提交。在git log或gitk中浏览提供了提交散列,但我需要一种简单的方式说“从存储库获取提交1234abcd../UpstreamRepo并在此处应用它” 在这种特殊情况下,我还希望能够将新提交限制为原始文件的一个文件(已知名称)。新闻等辅助文件不适用于此处,只会导致不必要的合并冲突。这是首选,但不是必需的(其他人可能有类似的情况,不需要这样做)。我目前最好的解决方案是: git-C../U

我有两个存储库,它们共享一些代码,但不是全部。有时我需要从一个存储库(上游)到另一个存储库(下游)选择提交。在
git log
gitk
中浏览提供了提交散列,但我需要一种简单的方式说“从存储库获取提交1234abcd../UpstreamRepo并在此处应用它”


在这种特殊情况下,我还希望能够将新提交限制为原始文件的一个文件(已知名称)。新闻等辅助文件不适用于此处,只会导致不必要的合并冲突。这是首选,但不是必需的(其他人可能有类似的情况,不需要这样做)。

我目前最好的解决方案是:

git-C../UpstreamRepo show 1234abcd | sed'1d;2s/^Author/From/'| git am-

管道中的sed有两个原因:首先,
gitshow
将提交散列放在第一行,这
gitam
将对象放在第一行;其次,
gitam
无法将第二行的
Author:
识别为作者身份标记。所以有点难看


所有常见的
git show
子命令都可用,包括将其限制为特定文件,以及使用分支相对提交命名,而不是获取特定哈希。

如果repos a和B在同一台机器上,或者在两台可以相互通信的机器上。目标是获得B的一个提交并将其应用于A的一个分支

cd <path_A>
git checkout <branch_A>
git fetch <path_B> <ref_that_contains_commitB>
git cherry-pick <commitB>

cd
git格式修补程序-1--
#xxx.patch已生成
#将xxx.patch移动到A的工作区
光盘
git签出
吉特阿姆

请注意,导入不必担心合并冲突。如果它们发生,我将处理它们(可能使用
gitam--abort
并忽略该提交)。它只需要从外部存储库获取一个提交并在此处应用。如果它是一个上游和下游存储库,为什么不将一个存储库作为远程存储库添加到另一个存储库中,然后选择更改?因为连接并不是那么紧密。基本上只有一个文件在他们之间共享,甚至不是所有的文件。实际上,在我的特定用例中,文件甚至没有相同的名称,因此我在过滤器中有第三个sed命令-从globals.pike更改为window.pike。在所有情况下,我希望能够灵活地将提交减少到一个文件。(将编辑问题以澄清这一点。)此外,我并不想像第一次那样获取整个目标回购协议
git格式补丁
非常接近(这是我在创建新方法之前使用的),但非常笨拙。这个包裹很有趣——我会仔细看看——但看起来也很笨重。
cd <path_B>
git format-patch <commitB> -1
#a xxx.patch is generated
#move this patch to A's workground.
cd <path_A>
git checkout <branch_A>
git am <path_xxx.patch>
cd <path_B>
git bundle create B.bundle <ref_that_contains_commitB>
#B.bundle is generated
#move this bundle to A's workground.
cd <path_A>
git checkout <branch_A>
git fetch <path_B.bundle>
git cherry-pick <commitB>
cd <path_B>
git push <url_C> <ref_that_contains_commitB>:<ref_in_C>
cd <path_A>
git fetch <url_C> <ref_in_C>
git checkout <branch_A>
git cherry-pick <commitB>
cd <path_B>
git diff <commitB>^ <commitB> -- <file_b>    >   b.patch
#move b.patch to A's workground
cd <path_A>
git checkout <branch_A>
git apply <path_b.patch>
git add .
git commit -m 'xxx'
cd <path_B>
git format-patch <commitB> -1 -- <file_b>
#xxx.patch is generated
#move xxx.patch to A's workground
cd <path_A>
git checkout <branch_A>
git am <path_b.patch>