我想在我的工作 git 存储库中 merge 一个远程 git 存储库作为它的子目录。我希望生成的存储库包含两个存储库的 merge 历史记录,并且 merge 存储库的每个文件都保留其在远程存储库中的历史记录。我尝试使用 How to use the subtree merge strategy 中提到的子树策略,但是在执行该过程之后,尽管生成的存储库确实包含两个存储库的 merge 历史记录,但是来自远程存储库的单个文件没有保留它们的历史记录(其中任何一个上的 `git log' 只显示一条消息“Merged branch ...”)。
我也不想使用子模块,因为我不想让两个组合的 git 存储库再分开。
是否可以将远程 git 存储库作为子目录 merge 到另一个 git 存储库中,其中来自远程存储库的单个文件保留其历史记录?
非常感谢您的帮助。
编辑: 我目前正在尝试使用 git filter-branch 重写 merge 存储库历史记录的解决方案。它似乎确实有效,但我需要对其进行更多测试。我会回来报告我的发现。
编辑 2: 为了让自己更清楚,我给出了我在 git 的子树策略中使用的确切命令,这导致远程存储库文件的历史记录明显丢失。 假设 A 是我目前正在使用的 git 仓库,B 是我想 merge 到 A 中作为它的子目录的 git 仓库。它做了以下事情:
git remote add -f B <url-of-B>
git merge -s ours --no-commit B/master
git read-tree --prefix=subdir/Iwant/to/put/B/in/ -u B/master
git commit -m "Merge B as subdirectory in subdir/Iwant/to/put/B/in."
执行完这些命令并进入目录 subdir/Iwant/to/put/B/in 后,我看到了 B 的所有文件,但是其中任何一个上的 git log 只显示提交消息“将 B merge 为 subdir/Iwant/to/put/B/in 中的子目录。”他们在 B 中的文件历史记录丢失了。
似乎 起作用的(因为我是 git 的初学者,我可能是错的)如下:
git remote add -f B <url-of-B>
git checkout -b B_branch B/master # make a local branch following B's master
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&subdir/Iwant/to/put/B/in/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
git checkout master
git merge B_branch
上面的 filter-branch 命令取自 git help filter-branch,我只更改了 subdir 路径。
最佳答案
git-subtree 是专为将多个存储库 merge 为一个同时保留历史记录(和/或拆分子树的历史记录,尽管这似乎与该问题无关)的用例而设计的脚本。它作为 git 树的一部分分发 since release 1.7.11 .
merge 存储库 <repo>在修订 <rev>作为子目录 <prefix> , 使用 git subtree add如下:
git subtree add -P <prefix> <repo> <rev>
git-subtree 实现了 subtree merge strategy以更加用户友好的方式。
缺点 是在 merge 历史中文件没有前缀(不在子目录中)。假设您 merge 存储库 a进入b .结果git log a/f1将向您显示除 merge 历史记录中的所有更改(如果有)。你可以这样做:
git log --follow -- f1
但这不会显示 merge 历史记录中的更改。
换句话说,如果你不改变a存储库中的文件 b , 那么你需要指定 --follow和一个无前缀的路径。如果您在两个存储库中更改它们,那么您有 2 个命令,其中没有一个显示所有更改。
更多信息 here .
关于git - 在子目录中 merge git 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6426247/
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在
文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g
在我让另一个人重做我的前端UI之前,我的Rails应用程序运行平稳。我已经尝试解决此错误3天了。这是错误:Nosuchfileordirectory-identifyExtractedsource(aroundline#59):575859606162@post=Post.find(params[:id])authorize@postif@post.update_attributes(post_params)flash[:notice]="Postwasupdated."redirect_to[@topic,@post]else{"utf8"=>"✓","_method"=>"patc
我正在尝试以一种更类似于普通RubyGem结构的方式构建我的Sinatra应用程序。我有以下文件树:.├──app.rb├──config.ru├──Gemfile├──Gemfile.lock├──helpers│ ├──dbconfig.rb│ ├──functions.rb│ └──init.rb├──hidden│ └──Rakefile├──lib│ ├──admin.rb│ ├──api.rb│ ├──indexer.rb│ ├──init.rb│ └──magnet.rb├──models│ ├──init.rb│ ├──invite.rb│ ├─
我想编写一个ruby脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"
关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec
我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co
我正在安装gitlabhq,并且在Gemfile中有对某些资源的“git://...”的引用。但是,我在公司防火墙后面,所以我必须使用http://。我可以手动编辑Gemfile,但我想知道是否有另一种方法告诉bundler使用http://作为git存储库? 最佳答案 您可以通过运行gitconfig--globalurl."https://".insteadOfgit://或通过将以下内容添加到~/.gitconfig:[url"https://"]insteadOf=git://
Activeadmingem已添加到我的rails项目中,但每次我尝试安装railsgactive_admin:install时,我都会收到类似的错误git://github.com/activeadmin/activeadmin.git(atmaster)isnotyetcheckedout.Runbundleinstallfirst.我肯定在运行“railsgactive_admin:install”之前运行了bundle。运行“bundleshow”后,我看到我已将“*activeadmin(1.0.0.pre3f916d6)”添加到我的项目中,但不断收到此错误消息。我的gem文