Cherry-pick 从其他回购提交到 git 回购的特定文件夹

Cherry-pick commits to a particular folder of git repo from other repo

我非常熟悉 git cherry-pick。目前我正在尝试从其他 git 存储库中挑选一些提交。 场景如下:

A -> git repo ("A/foo/B" where B is a directory inside foo)

B -> git repo

我的意图是 cherry-pick/apply-patches/merge 将 git 回购 B 提交到 A/foo/B 目录。

A/foo/B

我知道可以通过多种方式完成,例如合并、挑选和应用补丁。

我也试过下面的命令,达到了我的目的:

git --git-dir=../B/.git format-patch --stdout sha1^..sha1 | git am --directory='B/'

但是有什么方法可以用 cherry-pick 得到同样的东西来得到预期的解决方案或者任何其他完美的解决方案来弥补它。

求推荐!!

谢谢:)

您可以使用 submodules.

Submodules/subtree 基本上是 git 存储库在另一个 git 存储库中。

子树和子模块之间的主要区别在于文件的管理位置(作为独立存储库或在父存储库中)。

这是一个简单的脚本,它创建了 2 个存储库,然后将其中一个添加为第二个存储库的子模块。

此时在子模块文件夹内所做的更改是 "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

您可以使用 checkout-index 或只使用 checkout。两者各有利弊。

带结帐索引

  1. 将您的工作目录更改为 repo A
  2. git --git-dir=../B/.git checkout-index -a --prefix=B/
  3. git add B
  4. git commit

checkout-index 检查(顾名思义)存储库的索引。因此,您必须确保 repo B 的索引看起来像您想要的那样。优点是您可以在将其签出到工作目录之前修改索引。

结帐

  1. 将您的工作目录更改为 repo A
  2. mkdir B
  3. git --git-dir=../B/.git --work-tree=B checkout HEAD -- .
  4. git add B
  5. git commit

checkout 的优点是您可以按原样选择任何提交。使用分支、提交 ID 或标记而不是 HEAD.

缺点是,如果您签出 HEAD 以外的任何其他提交,HEAD 和存储库 B 的索引将会更改。因此,如果您返回存储库 B,您将看到此更改,如果您执行 git status.

what if i already have a directory name B in it and i just want to cherry-pick few commits from repository B to B directory

使用 checkout-index 文件夹 B 中已经存在的文件将不会被覆盖,直到您指定 --force 或仅指定 -f.

上面的checkout命令会覆盖已经存在的文件,因为我在最后使用了-- .。您可以通过将 . 替换为路径来 select 特定文件。例如。如果您只想检出一个 src 目录。

git --git-dir=../B/.git --work-tree=B checkout HEAD -- src