Git подмодули, коммутационные ветки и рекомендуемый способ включения внешних зависимостей JS (о мой)
У меня есть проект Ruby on Rails (с версией git), который включает в себя ряд внешних зависимостей JavaScript, которые существуют в различных публичных репозиториях GitHub. Какой лучший способ включить эти зависимости в мой репозиторий (в том числе, конечно, только вручную их копирование) таким образом, чтобы я мог контролировать, когда они обновляются?
Подмодулы
git кажутся идеальными способами, но это вызывает проблемы при переключении между несколькими ветвями, многие из которых не содержат одинаковых подмодулей.
Если подмодули git - лучший способ сделать это, я полагаю, что мой реальный вопрос: как я могу использовать подмодули между многими ветвями, не сталкиваясь с этой проблемой все время:
my_project[feature/new_feature√]$ git submodule update
Cloning into public/javascripts/vendor/rad_dependency...
remote: Counting objects: 34, done.
remote: Compressing objects: 100% (29/29), done.
remote: Total 34 (delta 9), reused 0 (delta 0)
Receiving objects: 100% (34/34), 12.21 KiB, done.
Resolving deltas: 100% (9/9), done.
Submodule path 'public/javascripts/vendor/rad_dependency': checked out '563b51c385297c40ff01fd2f095efb14dbe736e0'
my_project[feature/new_feature√]$ git checkout develop
warning: unable to rmdir public/javascripts/milkshake/lib/cf-exception-notifier-js: Directory not empty
Switched to branch 'develop'
my_project[develop⚡]$ git status
# On branch develop
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# public/javascripts/milkshake/lib/cf-exception-notifier-js/
nothing added to commit but untracked files present (use "git add" to track)
Ответы
Ответ 1
Альтернативой подмодулям является стратегия слияния поддерева. Скопировано с этой страницы (у нее больше информации, это только для справки):
В этом примере, скажем, у вас есть репозиторий в /path/to/B (но он может быть URL, если хотите). Вы хотите объединить основную ветвь этот репозиторий для dir-B подкаталог в вашей текущей ветке.
Вот последовательность команд, которая вам нужна:
$ git remote add -f Bproject /path/to/B
$ git merge -s ours --no-commit Bproject/master <2>
$ git read-tree --prefix=dir-B/ -u Bproject/master
$ git commit -m "Merge B project as our subdirectory"
$ git pull -s subtree Bproject master
Я лично нахожу это неудобно (я предпочитаю подмодули, даже с вышеупомянутым issus), хотя многие люди клянутся им.
Ответ 2
Оба этот блог и этот пост сообщает об этом предупреждение:
Это связано с тем, что удаление субмодуля в настоящий момент не поддерживается. Было много дискуссий о том, как сделать git лучше, но никто не реализовал его до сих пор. Но это в моем списке ToDo, поэтому следите за обновлениями...
(сказал Йенс Леманн в то время, ноябрь 2010 года).
Прямо сейчас (март 2011), я не вижу (или я пропустил) никаких улучшений на этом фронте.
Что бы сделать git checkout -f -q develop
в вашем случае?