我目前正在开发一个项目,我正在使用Git进行版本控制。
该项目位于包含其他一些项目的存储库中。每个项目都有自己的目录。
虽然除了当前项目之外的所有项目都非常小,以至于它们可以保留在一个存储库中,但我希望将当前项目移动到自己的Git存储库中。
我现在的问题是,如何将特定提交顶部的所有提交移动到新的存储库?
如果有人能告诉我如何实现这一点,我会很高兴。
答案 0 :(得分:1)
据我所知,你有一个包含多个项目的回购:
projects/
project1/
project2/
project3/
project4/
您希望将project3
转换为自己的存储库。
Github有splitting a subfolder out into a new repository的说明,你可以使用它。
git remote set-url origin <new repo url>
。重要的是首先要做到这一点,以避免意外地推进旧的回购。git filter-branch
修剪除所需子目录以外的所有内容。 git filter-branch --prune-empty --subdirectory-filter project3 master
。 project3/
中的所有文件现在都应位于根目录中。git push origin master
project3/
。 git rm project3
如果推送被拒绝请勿强行推送!检查origin
是否使用git remote -v
指向新存储库,并且新存储库为空。
project3
中的所有文件现在应该位于目录的顶部。其余的项目将在旧的仓库中安全地消失。如果您运行git log
,您仍会看到触及这些文件的所有提交。就好像project3
始终是存储库中唯一的东西。
答案 1 :(得分:0)
您可以克隆项目并指定--depth
选项。要限制你携带的提交数量,只需删除其他项目,留下你想要的那个。
这不是您想要的解决方案,您只需要计算要携带的提交数量,并将其设置为克隆的深度。
答案 2 :(得分:0)
免责声明这可能不是最干净的解决方案,但它可以做任何问题“将多次提交从回购A转移到回购B”
这可以通过制作和应用一组补丁来实现。
# in repo A
git format patch <sha1 of commit to count from>
# this will produce a bunch of XXXX-<Commit comment>.patch files
# move those files in newly created repo B
cd <path to repo b>
cp <path to repo a>/*.patch .
git am *.patch # replay patches on top of fresh repo
<强>更新强>
使用git-subtree找到了更好的解决方案 - 这可能正是您所需要的。
答案 3 :(得分:0)
首先,我们将创建一个变量,它是目录文件的所有提交列表,按从最旧到最新的顺序。:
folder=<new project>
sha=$(echo $(for x in $(git log --format=oneline --follow $folder| awk '{print $1;}'); do echo $x; done) | awk '{ for (i=NF; i>1; i--) printf("%s ",$i); print $1; }')
对不起大号1班轮。
你想制作一个新的回购。您希望能够从旧项目中选择提交到新项目的提交。我们需要将远程设置为旧的repo,但只需接受我们想要的提交。
old=<old project name>
cd ..
mkdir $folder
cd $folder
git init
git remote add $old $(pwd)/$old
所以现在我们可以通过我们之前发现的提交哈希来获取提交。
for x in $sha; do git cherry-pick $x; done
要将它全部包装起来,我们将删除远程链接到旧项目。看到你用github标记了这篇文章,我们也将为github设置一个新帖子。
git remote rm $old
git remote add origin <url for the new project you created>