首先,我要说我认为我应该怎么做但我的代码不会以任何方式编译我尝试.我的假设基于这个空ptree技巧的官方例子.在那里你可以找到下一行:
const ptree &settings = pt.get_child("settings", empty_ptree<ptree>());
Run Code Online (Sandbox Code Playgroud)
这表明从(或应该)可以从ptree中获取subptree.
所以我假设我们可以用BOOST_FOREACH
这样的方式迭代到ptree :
BOOST_FOREACH(const boost::property_tree::ptree &v,
config.get_child("servecies"))
{
}
Run Code Online (Sandbox Code Playgroud)
但我得到下一个错误:
错误1错误C2440:'初始化':无法从'std :: pair <_Ty1,_Ty2>'转换为'const boost :: property_tree :: ptree&'
或者如果我尝试
BOOST_FOREACH(boost::property_tree::ptree &v,
config.get_child("servecies", boost::property_tree::empty_ptree<boost::property_tree::ptree>()))
{
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
错误1错误C2039:'empty_ptree':不是'boost :: property_tree'的成员
那我该怎么做:如何通过Boost Ptree迭代并得到子Ptrees?
更新: 我也试过这样的代码
BOOST_FOREACH(boost::property_tree::ptree::value_type &v,
config.get_child("path.to.array_of_objects"))
{
std::cout << "First data: " << v.first.data() << std::endl;
boost::property_tree::ptree subtree = (boost::property_tree::ptree) v.second ;
BOOST_FOREACH(boost::property_tree::ptree::value_type &vs,
subtree)
{
std::cout << "Sub data: " << vs.first.data() << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
这编译,不会抛出任何exeptions但不会cout任何 …
如果我在我的一个存储库中执行此操作:
git subtree pull --prefix=frameworks/AquaticPrime --squash AquaticPrime
Run Code Online (Sandbox Code Playgroud)
我明白了:
Working tree has modifications. Cannot add.
Run Code Online (Sandbox Code Playgroud)
如果我这样做(当然是在同一个地方):
git status
Run Code Online (Sandbox Code Playgroud)
我明白了:
# On branch master
nothing to commit (working directory clean)
Run Code Online (Sandbox Code Playgroud)
我不太确定这里发生了什么.git status命令意味着我没有修改,所以我假设git子树拉引用了与子树相关的不同分支中的修改,但它并不完全清楚.
任何人都可以提供启发吗?
我们之前在主存储库中使用了许多子模块,但是为了提高项目的可维护性,我们开始了一个实验分支,我们用子树替换它们.
这很好 - 但是现在当我试图更新其中一个子树时,它错误地将更新合并到一个完全错误的目录中,甚至不是一个子树.
分支"子树"包含实验分支的主存储库是:git://github.com/hugowetterberg/goodold_drupal.git
要从以下位置合并更新的存储库:git://github.com/voxpelli/drupal-oembed.git
通过执行合并:git merge -s subtree oembed/master
应将更新合并到的路径:sites/all/modules/oembed /
它们合并的路径:modules/aggregator/translations /
任何人都知道如何获得子树的更新或错误是什么?
我正在测试使用git-subtree将库repo合并到一个更大的项目中.原则上似乎很棒.有时当我做一个"git subree pull"时,我会遇到这样的合并冲突:
<<<<<<< HEAD
=======
An inserted line from the lib repo
>>>>>>> 4d348903449ebb584ab224cb34c6038fbf6b352d
Run Code Online (Sandbox Code Playgroud)
这是在库仓库中进行的更改,合并到一个尚未在本地修改的文件中.或者另一个例子,我在本地项目仓库中添加了一行,但是在一个文件中,该文件是要合并的子树的一部分:
<<<<<<< HEAD
Another inserted line
=======
>>>>>>> 4d348903449ebb584ab224cb34c6038fbf6b352d
Run Code Online (Sandbox Code Playgroud)
为什么git会将这些报告为合并冲突,但该地区报告称冲突是空的?有什么方法可以预防吗?
这些很容易解决,但它搞砸了git子树的工作流程
我有遥控器Foo和Bar.Foo是一个包含大量目录的Web应用程序,/public
其中相关的目录包含各种文件和其他目录.
Bar是一组库和前端使用的东西,因此它应该/public/bar
在Foo中.Foo那里没有文件.
无论是子模块还是子树合并,这都是小菜一碟.然而…
Bar的树很乱,它有各种各样的预生产文件,比如PSD和FLA,唯一真正有用的部分就是它里面的东西/www/tools
.
所以,我想要做的是将Bar's合并/www/tools
到Foo中/public/bar
,并假装Bar的其余部分甚至不存在.
可以做?
(我认为这与你最初将你的项目合并为子树的项目非常类似.我不知道该怎么做.)
这是一个noob问题,但我正在解决这个问题.我继承了一个奇怪的问题,一个git子树似乎是repo腐败.
这是场景:项目B中正在使用基于git的项目A的子树.部署部署脚本用于将子树推送到项目B的回购:
git subree push -P sub/path/name --squash git@github.com:MyCo/project_b.git projectb_branch
它开始推动提交并失败
"fatal: bad object {sha}"
Run Code Online (Sandbox Code Playgroud)
我在源代码的git日志中搜索了SHA.它出现在提交中:
git-subtree-dir: app/assets/ui
git-subtree-split: {sha}
Run Code Online (Sandbox Code Playgroud)
目标repo(project_b)确实具有该SHA的提交但源repo没有.我浏览了子树shell脚本,我可以看到它在尝试使用git log查找该对象时失败(在toptree_for_commit函数中调用git log -l --pretty = format:'%T'{sha}).
在这一点上,我在我的头脑中,但渴望寻找解决方案.在我的有限知识允许的情况下,我对此进行了研究,所以我欢迎任何可以让我更接近解决方案的提示,技巧或RTFM.
衷心的感谢!
使用git-subtree
,运行时计算的差异git subtree split
数量随着时间的推移而增加,达到可以进行拆分的值需要很长时间.
修复它的一种方法是git rm
路径,提交它然后再git subtree add
返回.
是否有更简单/更简洁的方法来重置子树?
我一直在尝试使用git子树,并遇到了以下情况。
我使用git子树将一个外部项目添加到我的仓库中,我有意保留了上游项目的所有历史记录,因为我希望能够参考该项目的历史记录,并在以后为上游项目做出贡献。
事实证明,上游项目的另一个贡献者不小心将一个大文件推入了master分支。为了解决这个问题,上游项目改写了历史并将其推向了主人。在创建“ monorepo”时,我包括了该提交,并且我也想删除它。
如何更新存储库以反映子树的新历史记录?
我的第一个尝试是使用filter-branch完全删除子树和所有历史记录。
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD
Run Code Online (Sandbox Code Playgroud)
一旦删除了旧版本的子树,我就可以使用新的上游母版重新添加子树。但是,这不起作用,因为由于某种原因,提交历史记录仍显示在git日志输出中。
缺少以下内容:我想将提交消息推送到子树,但只推送适用于该树的消息.我该怎么做呢?
我有两个项目,Master
和Slave
. Slave
被签出作为签出的子树通过哪里是Master
检查到的分支:lib/slave
git subtree merge --prefix=lib/slave --squash projects/slave
projects/slave
Slave
分行:
掌握项目/奴隶→奴隶
现在我正在我的master
分支上工作,提交属于两个项目的文件,一切顺利.现在我想将更改推回到Slave
:
如果我进行正常合并,则每次提交都会获得提交,无论是否lib/slave
修改了任何文件.或者我可以做一个--squash
只获得一次提交,但我丢失了日志消息.
那么我该如何获得相应的日志消息呢?例如,如果我的master
日志历史是:
我希望这个添加到Slave
:
我在本地克隆了一个私有的GitHub仓库(我不能在这里分享).我想将此repo中的子文件夹拆分为新的子树仓库.我正在按照这些说明使用Git子树进行存储库分离(在将代码拆分到自己的存储库中).
我的具体命令是:
> git subtree split -P .\plugins\rg-feed-client -b rg-feed-client
Run Code Online (Sandbox Code Playgroud)
但它失败了,正好有24个"断言失败"错误消息,如下所示:
1/ 26 (0)2/ 26 (1)assertion failed: [ plugins/rg-feed-client = .\plugins\rg-fee
3/ 26 (2)assertion failed: [ plugins/rg-feed-client = .\plugins\rg-feed-client ]
...
26/ 26 (25)assertion failed: [ plugins/rg-feed-client = .\plugins\rg-feed-client ]
Run Code Online (Sandbox Code Playgroud)
如果我尝试任何其他子文件夹,完全相同.我不知道这里可能有什么问题......帮助!
我的仓库有2个遥控器:原点,以及我添加到我的仓库中的现有子树的遥控器.