将我的所有提交从一个仓库移动到另一个仓库

时间:2017-07-22 20:28:29

标签: git

我与其他几位作者一起提交了几次公共存储库。现在我想从仅我自己的提交构建我自己的存储库。我不确定如何开始,因为我需要保持原始历史不变。

3 个答案:

答案 0 :(得分:1)

这是非常不正统的问题。

这个公共存储库是某种项目还是一组松散的无关文件?

如果文件不相关(我的意思是您没有处理其他人的代码/文件),那么您可以使用git filter-branchgit cherry-pick的组合过滤和收集您的提交然后是git format-patch,您可以稍后在新的仓库之上申请。

粗略地看起来像这样:

  1. 使用git log查找提交的哈希值。我们假设一个提交的SHA等于b33787c
  2. Cherry pickgit cherry-pick b33787c
  3. 为此提交创建补丁:git format-patch -1 b33787c。这将导致0001-COMMIT-NAME.patch的创建,您可以在以后重复使用。
  4. 但是,如果您正在使用的文件属于一个有凝聚力的项目,我认为在执行此类操作后,此代码可能会以useful/functional的方式完成。

答案 1 :(得分:0)

您可以创建一个新的repo,然后过滤掉您作为git filter-branch

作者的提交

类似的东西:

git filter-branch --commit-filter '
    if [ "$GIT_COMMITTER_NAME" = "<Your name>" ];
    then
        # use this commit 
    fi' HEAD `

答案 2 :(得分:0)

准备好移动文件:

制作存储库A的副本,这样你就可以搞砸它而不必过多担心错误。删除原始存储库的链接也是一个好主意,以避免意外进行任何远程更改(第3行)。第4行是这里的关键步骤。它会遍历您的历史记录和文件,删除目录1中不存在的任何内容。结果是目录1的内容扩展到存储库A的基础。您可能希望将这些文件导入到目录中的存储库B中,因此现在将它们移动到一个(第5/6行)。提交您的更改,我们已准备好将这些文件合并到新存储库中。

 1. git clone <git repository A url>
 2. cd <git repository A directory>
 3. git remote rm origin
 4. git filter-branch --subdirectory-filter <directory 1> -- --all
 5. mkdir <directory 1>
 6. mv * <directory 1>
 7. git add .
 8. git commit

将文件合并到新存储库中:

如果您还没有存储库B,请复制存储库B.在第3行,您将创建一个到存储库A的远程连接作为存储库B中的分支。然后只需从此分支(仅包含您要移动的目录)拉到存储库B.该pull复制文件和历史记录。注意:您可以使用合并而不是拉动,但拉动对我来说效果更好。最后,您可能希望通过删除与存储库A的远程连接来清理一下。提交并且您已完成设置。

 1. git clone <git repository B url>
 2. cd <git repository B directory>
 3. git remote add repo-A-branch <git repository A directory>
 4. git pull repo-A-branch master
 5. git remote rm repo-A-branch

将提交从A移动到B存储库

  1. 检查整棵树。

    git log --all --oneline --graph --decorate --abbrev-commit

  2. 将A repo中的提交复制(樱桃挑选)到B仓库。

    git cherry-pick sha-of-commit-one git cherry-pick sha-of-commit-two git cherry-pick sha-of-commit-three

  3. 检查您当地的回购是否正确。

    git log

  4. 将您的新树(回购状态)发送到新存储库。

    git push origin master

  5. 删除现在不需要的对oldrepo A的引用。

    git remote remove oldrepo A

  6. 特定作者将评论从A回复到B回购

    1. 按作者查找所有提交并将其哈希值保存到文件中:

      git log --author=<author> --format=%H > /tmp/commit-by-author

    2. 创建一个不包含此特定作者的新分支 提交。为此,您可以创建一个新的空分支:

      git checkout --orphan commits-by-author

    3. Cherry挑选该作者的所有提交(从A到B Repo):

      tac /tmp/commit-by-x | while read sha; do git cherry-pick ${sha}; 完成