我正在使用一个git存储库,需要从另一个git存储库提交,该存储库对第一个一无所知。

通常我会在reflog中使用HEAD@{x}进行筛选,但因为这个.git不知道这个reflog条目(不同的物理目录),我如何才能筛选它,或者我可以吗?

我使用git-svn。我的第一个分支使用Subversion repo中继的git-svn,下一个分支在Subversion分支上使用git-svn。


当前回答

下面是一个远程获取-合并的例子。

cd /home/you/projectA
git remote add projectB /home/you/projectB
git fetch projectB

然后你可以:

git cherry-pick <first_commit>..<last_commit>

或者你甚至可以合并整个分支(只有当你真的需要合并所有东西时)

git merge projectB/master

其他回答

你可以这样做,但是需要两个步骤。方法如下:

git fetch <remote-git-url> <branch> && git cherry-pick FETCH_HEAD

将<remote-git-url>替换为您想从中选择的存储库的url或路径。

将<branch>替换为您想要从远程存储库中挑选的分支或标记名称。

你可以用分支中的git SHA替换FETCH_HEAD。

更新:根据@pkalinow的反馈进行了修改。

对于这种情况,必须为一些本地化验证“精心挑选”提交。 对于相同的存储库签出,也可以是本地提交(即尚未推送到服务器)。

E.g.

Repo1类似于repo2 repo1的分支b1 - HEAD在本地进行了2次提交(包括commit_x)。 Repo2有分支bb1 -需要挑选commit_x。

为此,

$ CD repo2

Repo2 $ git获取<path_to_repo1>

Repo2 $ git cherry-pick <commit_x>

在上面的例子中,commit_x现在是可识别的并被提取(通过fetch的帮助)。

参见如何使用Git创建和应用补丁。(从你问题的措辞来看,我假设这个其他的存储库是用于完全不同的代码库的。如果它是相同代码库的存储库,您应该按照@CharlesB的建议将其添加为远程存储库。即使它是用于另一个代码库,我猜您仍然可以将其作为远程添加,但您可能不想将整个分支添加到存储库中…)

我的情况是,我有一个裸回购,团队推动,和一个克隆的旁边。Makefile中的这组行对我来说是正确的:

git reset --hard
git remote update --prune
git pull --rebase --all
git cherry-pick -n remotes/origin/$(BRANCH)

通过保持裸回购的主人是最新的,我们能够挑选对裸回购发布的建议更改。我们还有一种(更复杂的)方法来挑选多个分支来进行合并审查和测试。

如果“一无所知”意味着“不能用作遥控器”,那么这并没有什么帮助,但是当我在谷歌上搜索这个工作流时,这个SO问题出现了,所以我想我应该做出贡献。

如果您希望为给定文件挑选多个提交,直到完成给定提交,那么可以使用以下方法。

# Directory from which to cherry-pick
GIT_DIR=...
# Pick changes only for this file
FILE_PATH=...
# Apply changes from this commit
FIST_COMMIT=master
# Apply changes until you reach this commit
LAST_COMMIT=...

for sha in $(git --git-dir=$GIT_DIR log --reverse --topo-order --format=%H $LAST_COMMIT_SHA..master -- $FILE_PATH ) ; do 
  git --git-dir=$GIT_DIR  format-patch -k -1 --stdout $sha -- $FILE_PATH | 
    git am -3 -k
done