我与其他几位作者一起提交了几次公共存储库。现在我想从仅我自己的提交构建我自己的存储库。我不确定如何开始,因为我需要保持原始历史不变。
答案 0 :(得分:1)
这是非常不正统的问题。
这个公共存储库是某种项目还是一组松散的无关文件?
如果文件不相关(我的意思是您没有处理其他人的代码/文件),那么您可以使用git filter-branch
和git cherry-pick
的组合过滤和收集您的提交然后是git format-patch
,您可以稍后在新的仓库之上申请。
粗略地看起来像这样:
git log
查找提交的哈希值。我们假设一个提交的SHA
等于b33787c
Cherry pick
与git cherry-pick b33787c
git format-patch -1 b33787c
。这将导致0001-COMMIT-NAME.patch
的创建,您可以在以后重复使用。但是,如果您正在使用的文件属于一个有凝聚力的项目,我认为在执行此类操作后,此代码可能会以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存储库
检查整棵树。
git log --all --oneline --graph --decorate --abbrev-commit
将A repo中的提交复制(樱桃挑选)到B仓库。
git cherry-pick sha-of-commit-one
git cherry-pick sha-of-commit-two
git cherry-pick sha-of-commit-three
检查您当地的回购是否正确。
git log
将您的新树(回购状态)发送到新存储库。
git push origin master
删除现在不需要的对oldrepo A的引用。
git remote remove oldrepo A
特定作者将评论从A回复到B回购
按作者查找所有提交并将其哈希值保存到文件中:
git log --author=<author> --format=%H > /tmp/commit-by-author
创建一个不包含此特定作者的新分支 提交。为此,您可以创建一个新的空分支:
git checkout --orphan commits-by-author
Cherry挑选该作者的所有提交(从A到B Repo):
tac /tmp/commit-by-x | while read sha; do git cherry-pick ${sha}
;
完成