Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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存储库附加到另一个存储库之上_Git_Tfs_Tfvc_Git Tfs - Fatal编程技术网

如何将git存储库附加到另一个存储库之上

如何将git存储库附加到另一个存储库之上,git,tfs,tfvc,git-tfs,Git,Tfs,Tfvc,Git Tfs,我正在将一个项目从TFS转换为git,我想保留所有的历史记录 问题是TFS项目在一年前被转移到TFS。 使用git tfs,我可以将这两个位置转换为git,但现在我有两个git存储库:A和B 我已经设法将A和B作为不同的分支放在同一个存储库中。是否可以将B中第一次提交的父级更改为A中的最后一次提交 Branch A: a -> b -> c Branch B: d -> e -> f 我想要 a -> b -> c -> d' -> e' -&g

我正在将一个项目从TFS转换为git,我想保留所有的历史记录

问题是TFS项目在一年前被转移到TFS。 使用git tfs,我可以将这两个位置转换为git,但现在我有两个git存储库:A和B

我已经设法将A和B作为不同的分支放在同一个存储库中。是否可以将B中第一次提交的父级更改为A中的最后一次提交

Branch A: a -> b -> c
Branch B: d -> e -> f
我想要

a -> b -> c -> d' -> e' -> f'
解决方案:

git filter-branch --parent-filter 'sed "s/^\$/-p <last-commit-in-A>/"' HEAD_OF_B
git筛选器分支--父筛选器“sed”s/^\$/-p/”头

当然,设置一个
移植物
,它正好可以做到这一点。如果您对结果感到满意,可以执行
过滤器分支
,以永久性地执行此操作。或者您可以立即使用
过滤器分支
--父过滤器

我可以想出两种解决方案:

  • 创建父存储库并将存储库a和B添加为子模块。您可以通过阅读git子模块的文档了解更多信息

  • 将存储库B作为远程存储库添加到存储库a:

    $ git remote add repoB <directory where repo B is located>
    
    (如果这样做更有意义,您可以用另一种方法:将repo A作为远程添加到repo B。同样的概念也适用。)


  • 这不起作用,因为git存储库不共享历史。A的最后一次提交和B的第一次提交具有完全相同的内容。但它们的SHA1哈希值不一样。这两份回购协议都是从TFS转换而来的。@sigol“不起作用”是什么意思?我使用了
    git merge
    作为示例。也许
    git-rebase
    更适合您的情况。我认为
    git-merge
    git-rebase
    不起作用,因为这两个分支有不相关的提交。分支机构A:A->b->c分支机构b:d->e->f这两个早午餐有完全不相关的历史。我想要这个历史a->b->c->d'->e'->f'我不能使用rebase,因为rebase将删除合并提交。好的,
    merge
    可以使用
    --allow unrelated histories
    开关与无关历史一起使用,但这并不是您实际需要的情况。如果您使用
    --on
    开关,则
    重设基址
    可以用于任何历史记录,但也不是您想要的情况。您还可以使用
    保留合并
    进行
    重基
    保留合并提交,这可能会产生您想要的结果,尤其是在您不重新排序提交的情况下。但是,在你的情况下,这不是你想要的。:-)
    $ git checkout master
    $ git pull repoB master