我非常熟悉git的cherry-pick。目前,我正试图从其他git存储库中挑选一些提交。场景如下:
A -> git repo ("A/foo/B"其中B是foo中的目录)
B -> git repo
我的意图是挑选/apply-patches/合并git repo B的提交到A/foo/B目录。
/foo/B
我知道有很多方法可以做到,比如合并、择优选择和应用补丁。
我也尝试了下面的命令,这是满足我的意图:
git --git-dir=../B/.git format-patch --stdout sha1^..sha1 | git am --directory='B/'
但是有什么方法可以用同样的方法来获得预期的解决方案或者任何其他完美的解决方案来弥补吗?
请建议! !
谢谢你
您可以使用checkout-index
或仅使用checkout
。两者各有利弊。
- 将工作目录改为repo
A
-
git --git-dir=../B/.git checkout-index -a --prefix=B/
-
git add B
-
git commit
checkout-index
检出(顾名思义)存储库的索引。因此,您必须确保repo B
的索引看起来像您想要的那样。好处是您可以在将索引签出到工作目录之前修改它。
与结帐
- 将工作目录改为repo
A
-
mkdir B
-
git --git-dir=../B/.git --work-tree=B checkout HEAD -- .
-
git add B
-
git commit
checkout
的优点是您可以选择任何提交。使用分支、提交id或标签代替HEAD
。
缺点是,如果您签出HEAD
以外的任何其他提交,HEAD
和存储库B
的索引将会更改。所以如果你回到B
,你会看到这些变化,如果你做一个git status
。
如果我已经有了一个目录名B,我只是想从仓库B中挑选一些提交到B目录
对于checkout-index
,文件夹B
中已经存在的文件将不会被覆盖,直到指定--force
或仅指定-f
。
上面的checkout
命令将覆盖已经存在的文件,因为我在最后使用-- .
。您可以通过将.
替换为路径来选择特定的文件。例如,如果你只想签出一个src
目录。
git --git-dir=../B/.git --work-tree=B checkout HEAD -- src
可以使用子模块
子模块/子树基本上是git库中的另一个git库。
子树和子模块之间的主要区别在于管理文件的位置(作为独立存储库还是在父存储库中)。
下面是一个简单的脚本,创建两个存储库,然后添加其中一个作为第二个存储库的子模块。
此时,在子模块文件夹内所做的更改"transparent"到父目录repo (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