我正在使用Git子树和我正在处理的几个项目,以便在它们之间共享一些基本代码.基本代码经常更新,升级可以在任何项目中进行,最终所有项目都会更新.
我遇到了一个问题,git报告我的子树是最新的,但是推送被拒绝了.例如:
#! git subtree pull --prefix=public/shared project-shared master
From github.com:****
* branch master -> FETCH_HEAD
Already up-to-date.
Run Code Online (Sandbox Code Playgroud)
如果我推,我应该得到一个消息,没有什么可以推动......对吗?对?:(
#! git subtree push --prefix=public/shared project-shared master
git push using: project-shared master
To git@github.com:***
! [rejected] 72a6157733c4e0bf22f72b443e4ad3be0bc555ce -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:***'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about …Run Code Online (Sandbox Code Playgroud) 我在git存储库中有一个Web应用程序.由于历史原因,Web应用程序不在存储库的根目录下,因此它位于名为的文件夹中website.除此之外还有一些其他文件夹,所以我有以下结构:
myApp
+- .git
+- otherFolder1
+- otherFolder2
+- otherFolder...
+- otherFolderN
+- website
Run Code Online (Sandbox Code Playgroud)
该网站在Heroku上运行.由于Heroku要求您的Web应用程序位于git存储库的根目录,所以直到现在我使用了一个构建过程,该过程将website文件夹复制到具有自己的git存储库的完全不同的(外部)文件夹.然后我就能从那里推到Heroku,一切都很好.
现在,因为git包含了这个subtree命令,所以不再需要了,因为我可以直接从我的初始文件夹中推送,但只是website子文件夹,使用:
git subtree push --prefix=website heroku master
Run Code Online (Sandbox Code Playgroud)
基本上,这非常有效.我只有一个问题:由于之前对Heroku的提交来自一个完全不同的git存储库,两者的历史记录彼此不匹配 - 因此Heroku检测到非快进推送,并拒绝subtree推送.
那么我该如何处理呢?
git subtree push没有--force选项(或类似的东西).我很想知道2,但我不知道如何实现这一目标.
我的第一个方法是运行一个git push heroku :master,但Heroku检测到这一点并否认它.
当然,我可以破坏应用程序并重新创建它,但是所有域分配和附加组件也都消失了,我想避免这种情况.
还有其他想法吗?
我正在尝试使用我的项目添加一个repo(称为cow)git subtree add.特别是,我想添加分支stable(不是master分支).我试过了:
git subtree add -P cow https://github.com/geoffryan/cow.git stable
Run Code Online (Sandbox Code Playgroud)
但是这返回了错误
'stable' does not refer to a commit.
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
git subtree add -P cow https://github.com/geoffryan/cow.git cow/stable
'cow/stable' does not refer to a commit.
Run Code Online (Sandbox Code Playgroud)
和:
git subtree add -P cow https://github.com/geoffryan/cow.git ca26d248a12c21264e32a2c212381cafb578c9fb
'ca26d248a12c21264e32a2c212381cafb578c9fb' does not refer to a commit.
Run Code Online (Sandbox Code Playgroud)
哈希是stable分支中最新提交的哈希值.我在网上看到的使用示例都master用于提交,是否可以subtree add在非主分支上使用?
是否有一种简单的方法来移动使用以下cmd添加的子树
git subtree add --prefix=<prefix> <repository> <commit>
Run Code Online (Sandbox Code Playgroud)
换句话说,是否可以将前缀更改dir1为dir2.
git子树的答案:可以在分叉存储库中更改子树分支/路径吗?建议删除子树然后添加回来.
它对我不起作用,因为我需要保留本地提交,还有另外一种方法吗?
假设我已经添加了一个新的远程“foo”,并拉了一个子树,压扁了,分支主。
$ git remote add -f foo some-repo.git
$ git subtree add --prefix=foo --squash foo master
Run Code Online (Sandbox Code Playgroud)
从我读过的文章(here和here等)来看,这似乎是切换分支的常用方法。在这种情况下,要分支“bar”:
$ git rm -r foo
rm 'foo/file'.
...
$ git commit -m "Delete foo on branch 'master' to switch to branch 'bar'."
1350 files changed, 144703 deletions(-)
delete mode 100644 foo/file
...
$ git subtree add --prefix=foo --squash foo bar
git fetch foo master
From some-repo.git
* branch master -> FETCH_HEAD
Added dir 'foo'
Run Code Online (Sandbox Code Playgroud)
但这感觉很脏。为什么不直接使用已经有分支参数的“git subtree pull”(没有 rm/commit/add)?
$ …Run Code Online (Sandbox Code Playgroud)