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

时间:2015-10-07 06:48:45

标签: git git-cherry-pick

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

  

A - > git repo(“A / foo / B”,其中B是foo中的目录)

     

B - > git repo

我的意图是将git repo B的提交/应用补丁/合并提交到A / foo / B目录。

  

A / FOO / B

我知道它可以通过多种方式完成,例如merge,cherry-pick和apply patch。

我也试过下面的命令,这符合我的意图:

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

但是有没有什么办法可以用樱桃挑选来获得预期的解决方案或任何其他完美的解决方案来弥补它。

请建议!!

谢谢:)

2 个答案:

答案 0 :(得分:2)

您可以使用checkout-indexcheckout。两者都有利有弊。

使用checkout-index

  1. 将您的工作目录更改为repo A
  2. git --git-dir=../B/.git checkout-index -a --prefix=B/
  3. git add B
  4. git commit
  5. 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
    6. 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
      

答案 1 :(得分:0)

您可以使用submodules

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

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

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

此时,在子模块文件夹内进行的更改"透明" 到父 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