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 в вашем случае?