我有一个很大的主项目,其中有几个目录作为子树。
我想将一个特定子树中的更改推送到其原点,这是一个单独的存储库。
问题似乎是,我想要推送的当前子树最初并不是来自我想要推送的存储库。它来自不同的 repo,通过我通过谷歌搜索找到的子树指南。它看起来非常相似。
大项目布局,important_subtree我担心的事情在哪里。
~/devel/bigproject
.git/
some_subtree/
other_subtree/
important_subtree/
abc.txt
efg.txt <--- new version
hij.txt
Run Code Online (Sandbox Code Playgroud)
并且important_subtree与该回购“密切相关”:
~/devel/important
.git/
abc.txt
efg.txt <--- old version
hij.txt
Run Code Online (Sandbox Code Playgroud)
现在~/devel/bigproject/important_subtree/efg.txt发生了变化,我想将 important_subtree 推送到 repo 上~/devel/important。所以后来~/devel/important/efg.txt也有变化。
我设法做的唯一的事情是推动推动一切在bigproject为重要,这显然不是我想要的。应该只推送子树中的更改。
我有多个项目与其他项目共享子应用程序.在项目目录中工作时,我希望能够对应用程序进行更改,更新它,并将这些更新提取到第二个项目中.
需求:
这是结构:
app_one (git repo)
|-- app_one (actual app uses by projects)
| +-- models.py
|-- README.md
+-- setup.py
project_one (git repo)
|-- project_one
| |-- apps
| | |-- app_one
| | | +-- models.py
| | | -- app_two
|-- setup.cfg
+-- setup.py
project_two (git repo)
|-- project_two
| |-- apps
| | |-- app_one (same app …Run Code Online (Sandbox Code Playgroud) 我尝试将目录及其所有历史记录从存储库移动到另一个存储库。
提取目录的完整历史记录很容易git subtree split。
这会创建一个新分支,可以轻松地将其提取到其他存储库。
现在我曾经git subtree add将目录粘贴回第二个存储库。
如果我看gitk或git log --decorate --graph一切看起来都很好。所有提交都按预期存在。此外,所有文件都按预期存在。
但是,当我尝试使用的是看一个移植文件的历史记录git log -- transplanted_dir/somefile,我只看到了一个“合并”承诺,从产生的git subtree add。
为什么我在上面的 gitk 中看到提交,但在单个文件的日志中没有?
如果我做一个简单的git merge,我可以看到每个文件的历史记录,但是这些文件当然不会存在于子文件夹中。
将移动的提交集成到另一个存储库中的正确方法是什么?
重现情况的详细示例命令:
#create two repositories:
git init a
git init b
# create directory dir with some history
cd a
mkdir dir
echo 1 > dir/file
git add .
git commit -am 1
echo 2 > dir/file
git commit -am 2
echo 3 …Run Code Online (Sandbox Code Playgroud) 我在我的项目中添加了一个子树,如下所示:
git subtree add --prefix sites/all/modules \
git@github-ucbdrupal.com:ucbdrupal/migrate_hrweb.git master --squash
Run Code Online (Sandbox Code Playgroud)
我设置了这些遥控器:
$ git remote -v
migrate-hrweb-github git@github-ucbdrupal.com:ucbdrupal/migrate_hrweb.git (fetch)
migrate-hrweb-github git@github-ucbdrupal.com:ucbdrupal/migrate_hrweb.git (push)
origin ssh://codeserver.dev.76fc8622-a639-4e1e-873e- 963cf71fd555@codeserver.dev.76fc8622-a639-4e1e-873e-963cf71fd555.drush.in:2222/~/repository.git (fetch)
origin ssh://codeserver.dev.76fc8622-a639-4e1e-873e-963cf71fd555@codeserver.dev.76fc8622- a639-4e1e-873e-963cf71fd555.drush.in:2222/~/repository.git (push)
Run Code Online (Sandbox Code Playgroud)
Git 状态显示没有变化。
在主分支上,我编辑子树目录中的 README.md。
我承诺:
[bwood@ucbmbp hrweb-ob-js]$ git commit -am "Test edit #4 of hrweb_migrate"
[master 6f4b9c1] Test edit #4 of hrweb_migrate
1 file changed, 1 insertion(+)
Run Code Online (Sandbox Code Playgroud)
我尝试将其推送到 migrate-hrweb-github 远程:
$ git subtree push -P sites/all/modules/migrate_hrweb migrate-hrweb-github master
using: migrate-hrweb-github master
Run Code Online (Sandbox Code Playgroud)
现在我必须等待这么长的对象计数完成(5 分钟)。主项目是一个大型 Drupal 安装。我认为每个对象都被计数/过滤:
1022/ 16200 (1022) [this updates for …Run Code Online (Sandbox Code Playgroud) 我有一个git项目有一个很大的根目录:
C:\MyProject\MyProject
C:\MyProject\.git
Run Code Online (Sandbox Code Playgroud)
然后所有文件和子目录都在里面C:\MyProject\MyProject.我想删除那个多余的根目录,所以我使用了这个命令:
git subtree split -P MyProject -b MyBranch
git checkout MyBranch
git branch -D master
git branch -m MyBranch master
Run Code Online (Sandbox Code Playgroud)
但是,此解决方案存在问题 - 标记仍附加到现已删除的原始主分支:

灰色分支是原始主分支,红色分支是没有冗余目录的新分支,但标记仍然附加到旧分支的签入.
问题:即使我没有任何更改,每次尝试拉入我的子树时,我都会遇到合并冲突。
我在做什么:
在子树仓库中
# Make some changes
$ git commit -am 'Changes made'
$ git push origin master
Run Code Online (Sandbox Code Playgroud)
在主回购
$ git subtree add --prefix public/common {{subtree-repo}} master --squash
# Make some changes
$ git commit -am 'Changes made'
$ git subtree push --prefix public/common {{subtree-repo}} master
Run Code Online (Sandbox Code Playgroud)
在子树仓库中
$ git pull origin master
# Make some changes
$ git commit -am 'Changes made'
$ git push origin master
Run Code Online (Sandbox Code Playgroud)
在主回购
$ git subtree pull --prefix public/common …Run Code Online (Sandbox Code Playgroud) 假设我有Foo两个分支的存储库:A和B.科A是分支的始祖B.
假设我A按照本指南中的说明在分支中设置子树.一旦我完成所有设置,当我稍后将分支合并A到分支时会发生什么B?显然我希望分支B自然地继承子树,就像我再次手动设置它一样B.实际会发生什么?
如何将--prefix设置为空,以便子树文件夹是工作目录?
git subtree add --prefix sub-module master --squash
Run Code Online (Sandbox Code Playgroud) 我可以在子树中使用标签吗?根据具体问题:
我有一个git存储库,其中包含一个外部存储库作为子树.我可以添加此外部存储库并从此存储库中签出特定分支.随着git subtree pull --prefix=<dir> --squash <remote> <branch>所选分支的更新运行良好.
现在可以签出特定的标签吗?我无法在子树中找到有关标签的一些信息......
我正在尝试将git存储库的一部分推送到Heroku。
这是存储库结构
网站
---共享
--- site1
--- site2
------共享(这是父目录中共享的符号链接)。
如果我尝试site2在Heroku上简单地推送内容,则由于未shared包含文件,该捆绑包将失败。
我正在寻找一种在Heroku shared上site2使用git子树发送的方式。
有什么建议么?