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中合并到您的主分支中.
假设您想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 历史记录。
有时您希望我们子树中的提交被压缩为单个提交。这在一定程度上违背了添加子树的目的,但它有它的位置。以下是上述内容的变体,以限制拉入您的回购的历史记录
从您希望将子树添加到的分支开始:
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)
这是@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)
归档时间: |
|
查看次数: |
7599 次 |
最近记录: |