Git Subtree只有一个文件或目录

kic*_*caj 24 git bitbucket git-subtree

我使用Git Subtree如下:

git subtree add --prefix=directory_destination_path --squash git@bitbucket.org:kicaj/projectname.git master
Run Code Online (Sandbox Code Playgroud)

但在路径:directory_destination_path复制所有回购projectname.git

如何复制到directory_destination_path只有子目录或只有一些文件projectname.git

编辑:还有
一个问题:
如何更新(自动)两个存储库中的文件更改仍然是相同的?有可能的?

edd*_*oya 19

如果我理解,您似乎只想合并到不同存储库的某个目录中,并且您希望它成为存储库中的子树.我打算在project.git中path_of_interest_in_project调用感兴趣的目录,并在你的仓库中调用目的地directory_desination_path.

尝试将远程project.git添加为远程,然后在本地检出其中一个分支.然后使用git-subtree split分割出你感兴趣的project.git目录.之后使用子树合并将它合并到你的repo中.

git remote add project git@bitbucket.org:kicaj/projectname.git
git branch project_master project/master
Run Code Online (Sandbox Code Playgroud)

分支project_master现在应该存储project.git repo的整个历史记录.

然后你需要使用这个git-subtrees-split过程.

git checkout -f project_master
git subtree split --squash --prefix=path_of_interest_in_project -b temp_branch
Run Code Online (Sandbox Code Playgroud)

现在应该有一个名为temp_branch仅包含您感兴趣的目录的分支.现在您可以执行a git-subtree-merge将所有内容全部放入您的仓库.

git checkout -f master
git subtree merge --allow-unrelated-histories --prefix=directory_destination_path temp_branch
Run Code Online (Sandbox Code Playgroud)

这应该在temp_branch中合并到您的主分支中.

  • 那么如何更新唯一的文件或目录?再做一步? (7认同)
  • 就它们同步而言,没有内置的方法来自动保持这些文件(仅)同步。您将不得不编写一个脚本来处理这一切。更简单的事情可能是将这些文件作为独立的存储库进行跟踪,并将它们用作两个项目中的子文件。总体而言,这根本不是一个好的工作流程。 (2认同)
  • 问题:你需要`git fetch`才能`git branch`否则你会'致命:不是有效的对象名`.当我进入`git subtree split`时,我不知道该怎么做,因为我得到了'致命的:模糊的论证'temp_branch':未知的修订或路径不在工作树中. (2认同)
  • 命令中有一个拼写错误.我编辑了它.在分支名称之前需要-b.它现在与OP意图完全一样. (2认同)
  • 据我所知,只有当 `path_of_interest_in_project` 是一个目录时,`git subtree split --squash --prefix=path_of_interest_in_project -b temp_branch`。在这种情况下,它会获取与该目录中所有文件相关的提交。有没有办法指定一个且只有一个 __file__? (2认同)
  • 这个答案肯定已经过时了,应该更新。没有“git subtree add”的“git subtree merge”会对我产生“不存在”错误。也不接受“--allow-unrelated-histories”标志。 (2认同)
  • 在我的例子中,省略“--squash”并使用“git subtree add”而不是“merge --allow-unrelated-histories”效果很好!:) (2认同)

rud*_*ph9 7

假设您想images/在 ref 处添加octocat git repo的前缀master

假设我们要使用托管在https://github.com/octocat/octocat.github.io.git的远程(注意:GitHuberror: Server does not allow request for unadvertised object在以下fetch命令中返回的是您指定了一个不与命名 ref 关联的 sha1)

从您希望添加子树的分支开始,让我们首先获取所需的提交历史并检查我们的新分支

git fetch https://github.com/octocat/octocat.github.io.git master:tmp_octocat_master
git checkout tmp_octocat_master
Run Code Online (Sandbox Code Playgroud)

接下来,让我们创建一个新的历史记录,其中只有我们想要的前缀 ( images/)下的文件存在。

git subtree split --prefix=images -b subtree_split_branch
Run Code Online (Sandbox Code Playgroud)

最后,让我们将此子树添加到我们想要的分支(大概是您所在的最后一个分支,git checkout -

git checkout -
git subtree add --prefix=public/images subtree_split_branch
Run Code Online (Sandbox Code Playgroud)

现在,您应该在当前分支上拥有所有所需的文件,并具有完整的 git 历史记录。

Alt 压扁历史

有时您希望我们子树中的提交被压缩为单个提交。这在一定程度上违背了添加子树的目的,但它有它的位置。以下是上述内容的变体,以限制拉入您的回购的历史记录

从您希望将子树添加到的分支开始:

git fetch --depth=1 https://github.com/octocat/octocat.github.io.git master:tmp_octocat_master
git checkout tmp_octocat_master
Run Code Online (Sandbox Code Playgroud)

注意:我们--depth=1在上面指定是因为我们使用的--squash是以下git subtree split命令。

git subtree split --squash --prefix=images -b subtree_split_branch
git checkout -
git subtree add --prefix=public/images subtree_split_branch
Run Code Online (Sandbox Code Playgroud)

  • 那么这个子树如何根据自己的远程进行更新呢? (2认同)

max*_*mus 5

这是@eddiemoya的一个很好的答案,但是有些命令截至今天不起作用。所以我将它们重新发布在这里:

# create a target branch in the new repo
git branch target

# check out the other repo into a new branch
git remote add temp git@github.com:aRepo/any-service.git
git fetch temp
git branch temp_master temp/master

# split desired folder into a temp branch
git checkout -f temp_master
git subtree split --prefix=path/to/desired/folder -b temp_branch

# check out target branch and add all commits in temp branch to the correct folder
git checkout -f target
git subtree add --prefix=path/to/destination/folder temp_branch
# ... voila

# clean up
git branch -d temp_branch
git branch -d temp_master
git remote remove temp
Run Code Online (Sandbox Code Playgroud)