7

我需要在项目的 Git 存储库中保留 WordPress 的副本。

我想使用 Git 从 GitHub 拉下 WordPress 更新,然后通过git push和/或推送这些更新git svn dcommit

我目前有一个使用 Git 子模块的解决方案,它可以工作;但是现在我需要将我的最新项目部署到仅支持 SVN 的服务器上,并且我无法直接访问该服务器。因此,子模块被淘汰了。

我对Git 的子树合并策略进行了大量阅读,我认为这是正确的解决方案;但我读过的所有内容都希望我想要关注一个远程分支,并且总是拉下它最新的代码。

相反,GitHub 上的 WordPress使用它的master分支——实际上是它的所有分支——进行开发;发布被标记,但就是这样。正式来说,所有分支都处于永久的 alpha 状态。

我想我需要弄清楚的是如何子树合并标签

现在,我这样做是为了将 WordPress 3.5 读入webroot/wordpress(以及命名空间 WordPress 标签),它可以工作:

$ git remote add -t master --no-tags wordpress git://github.com/WordPress/WordPress.git
$ git config --add remote.wordpress.fetch +refs/tags/*:refs/tags/wordpress/*
$ git fetch wordpress
warning: no common commits
remote: Counting objects: 138547, done.
remote: Compressing objects: 100% (28297/28297), done.
remote: Total 138547 (delta 110613), reused 137367 (delta 109624)
Receiving objects: 100% (138547/138547), 46.05 MiB | 2.26 MiB/s, done.
Resolving deltas: 100% (110613/110613), done.
From git://github.com/WordPress/WordPress
 * [new branch]      master     -> wordpress/master
 * [new tag]         1.5        -> wordpress/1.5
...
 * [new tag]         3.5        -> wordpress/3.5
 * [new tag]         3.5.1      -> wordpress/3.5.1
$ git read-tree --prefix=webroot/wordpress/ -u wordpress/3.5
$ git commit -m "Added WordPress 3.5 at webroot/wordpress"
[master c483104] Added WordPress 3.5 at webroot/wordpress
 1061 files changed, 269102 insertions(+)
 create mode 100644 webroot/wordpress/index.php
 create mode 100644 webroot/wordpress/license.txt
 create mode 100644 webroot/wordpress/readme.html
...

但是,无论我尝试什么,我都不知道如何使用子树合并来使用 WordPress 3.5.1 更新它。

尝试mergeand read-tree,根据this,不起作用:

$ git merge -s ours --squash --no-commit wordpress/3.5.1
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested
$ git read-tree --prefix=webroot/wordpress/ -u wordpress/3.5.1
error: Entry 'webroot/wordpress/index.php' overlaps with 'webroot/wordpress/index.php'.  Cannot bind.

尝试子树合并失败:

$ git merge -s subtree --squash --no-commit wordpress/3.5.1
warning: Cannot merge binary files: webroot/wordpress/wp-includes/js/tinymce/wp-tinymce.js.gz (HEAD vs. wordpress/3.5.1)
...
Squash commit -- not updating HEAD
Automatic merge failed; fix conflicts and then commit the result.

git pull -s subtree --squash --no-commit wordpress 3.5.1以同样的方式失败。)

我试过添加-Xtheirsgit merge,我试过递归merge-Xsubtree我试过临时分支和子树合并的每一种组合,我能弄清楚——但我似乎无法破解这个。

有任何想法吗?还是我应该放弃并以老式方式下载(并重新下载和重新下载)WordPress?

4

1 回答 1

10

如果您想要做的只是经常将远程文件拉入您的项目,并且您不关心将其历史连接到您的历史,则不需要任何合并。

最终,解决方案非常简单:

  • 从 Git 索引中删除旧版本的 WordPress;
  • 使用 ; 将新版本的 WordPress 拉入 Git 索引read-tree
  • 犯罪。

read-tree是您在这里需要的唯一工具,并且由于read-tree(巧妙地)拒绝覆盖文件,您只需从索引中删除旧树,然后再将新树读入其位置。

$ git rm -r webroot/wordpress
rm 'webroot/wordpress/index.php'
rm 'webroot/wordpress/license.txt'
rm 'webroot/wordpress/readme.html'
...
$ git read-tree --prefix=webroot/wordpress/ -u wordpress/3.5.1
$ git commit -m "Updated to WordPress 3.5.1"
[master 9665ad7] Updated to WordPress 3.5.1
 44 files changed, 406 insertions(+), 176 deletions(-)
 rewrite webroot/wordpress/wp-admin/js/post.min.js (81%)
 rewrite webroot/wordpress/wp-includes/js/media-editor.min.js (99%)
 rewrite webroot/wordpress/wp-includes/js/media-views.min.js (89%)
...
于 2013-02-05T22:19:00.133 回答