[英]Cherry-pick commits to a particular folder of git repo from other repo
我对git cherry-pick非常熟悉。 目前,我正在尝试从其他git存储库中挑选一些提交。 场景如下:
A-> git repo(“ A / foo / B”,其中B是foo中的目录)
B-> git回购
我的意图是将git repo B的cherry-pick / apply-patches / merge提交合并到A / foo / B目录。
A / foo / B
我知道它可以通过多种方式来完成,例如合并,樱桃选择和应用补丁。
我也在下面的命令中尝试过,这符合我的意图:
git --git-dir=../B/.git format-patch --stdout sha1^..sha1 | git am --directory='B/'
但是,有什么方法可以用Cherry-Pick来获得相同的东西,从而获得预期的解决方案,或者通过任何其他完美的解决方案来弥补它。
请建议!
谢谢 :)
您可以使用checkout-index
或仅使用checkout
。 两者都有优点和缺点。
带结帐索引
A
git --git-dir=../B/.git checkout-index -a --prefix=B/
git add B
git commit
checkout-index
检出(顾名思义)存储库的索引。 因此,您必须确保存储库B
的索引看起来像您想要的那样。 优点是您可以在将索引检出到工作目录之前修改索引。
有结帐
A
mkdir B
git --git-dir=../B/.git --work-tree=B checkout HEAD -- .
git add B
git commit
checkout
是您可以按原样选择任何提交。 使用分支,提交ID或标签代替HEAD
。
con是,如果你签任何其他承诺比HEAD
的HEAD
资源库和索引B
将发生变化。 因此,如果返回到存储库B
,则执行git status
将看到此更改。
如果我已经有了目录名称B并且只想从存储库B到B目录挑选一些提交怎么办
对于文件夹B
中已经存在的checkout-index
文件,除非您指定--force
或just -f
否则它们不会被覆盖。
上面的checkout
命令将覆盖已经存在的文件,因为我使用-- .
在最后。 您可以通过替换选择特定文件.
与路径。 例如,如果您只想签出src
目录。
git --git-dir=../B/.git --work-tree=B checkout HEAD -- src
您可以使用子模块 。
子树和子模块之间的主要区别是文件的管理位置(作为独立存储库或在父存储库中)。
这是一个简单的脚本,该脚本创建2个存储库,然后将其中一个添加为第二个存储库的子模块。
此时,子模块文件夹中所做的更改对父存储库 (repo1)是“透明的”
# Clear old repositories if any
rm -rf /tmp/repo1
rm -rf /tmp/repo2
# Creating new empty repositories
git init repo1
git init repo2
# commiting to the first repository
cd /tmp/repo1
echo 'a' > file1.txt
git add .
git commit -m "Commiting to repo1"
# commiting to the second repository
cd /tmp/repo2
echo 'b' > file2.txt
git add .
git commit -m "Commiting to repo2"
# Adding repo2 as submodule of repo1
cd /tmp/repo1
git submodule add /tmp/repo2 repo2
git submodule init
git submodule update
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.