Как добавить/обновить/переустановить удаленный проект Git в моем репозитории без использования подмодулей?

Мне нужно сохранить копию WordPress в моем репозитории проекта Git.

Я хочу использовать Git, чтобы вытащить обновления WordPress из GitHub, а затем вытолкнуть эти обновления через git push и/или git svn dcommit.

В настоящее время у меня есть решение с использованием подмодулей Git, и оно работает; но теперь мне нужно развернуть мой новейший проект на сервере, который поддерживает только SVN и к которому у меня нет прямого доступа. Следовательно, подмодули отсутствуют.

Я проделал тонну чтения Git стратегии слияния поддерева, и я считаю это правильным решением; но все, что я читал, ожидает, что я захочу следовать за удаленной ветвью и всегда вытаскивать его самый последний код.

Наоборот, WordPress на GitHub использует свою ветку master - фактически, все ее ветки - для разработки; релизы отмечены, но это. Официально говоря, все ветки находятся в вечном альфа-состоянии.

Я думаю, что мне нужно выяснить, как поддерево объединить тег.

Прямо сейчас, я делаю это, чтобы читать 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.

Попытка merge и 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 не работает одинаково).

Я попытался добавить -Xtheirs в git merge, я пробовал рекурсивный merge с -Xsubtree, я пробовал каждую комбинацию временных ветвей и слияния поддерева, которые я могу выяснить, но я не может показаться, что это взломало.

Любые идеи? Или я должен просто отказаться и загрузить (и перезагрузить и перезагрузить) WordPress старомодным способом?

Ответ 1

Если все, что вы хотите сделать, часто вытаскивает удаленные файлы в ваш проект, и вы не заботитесь о подключении его истории к себе, тогда никакого слияния не требуется вообще.

В конечном счете, решение мертво просто:

  • Удалите старую версию WordPress из индекса Git;
  • Потяните новую версию WordPress в индекс Git с помощью read-tree;
  • Commit.

read-tree - единственный инструмент, который вам нужен здесь, и поскольку read-tree (smartly) отказывается перезаписывать файлы, вам просто нужно удалить старое дерево из индекса, прежде чем читать новое на своем месте.

$ 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%)
...