2013-10-27 2 views
1

у меня есть GIT репозитория А с содержимым:мерзавец поддерево из одной отрасли в нескольких местах того же проекта

<shared files dir>/ 
     sharedFile1 
     sharedFile2 

И у меня есть дополнительный репозиторий B 2 проектов, каждый из них должен использовать общие файлы из хранилища А. Так что структура файла будет похожа на это:

Project_X 
    <shared files dir>/ 
     sharedFile1 
     sharedFile2 
    <project X dirs> 

Project_Y 
    <shared files dir>/ 
     sharedFile1 
     sharedFile2 
    <project Y dirs> 

Я хотел бы разделяемые файлы обновляться только в хранилище а, и мне нужно, чтобы позволить project_X и Project_Y, чтобы получить эти обновления легко ,

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

Поддерево Git также выглядит как подходящее решение, но проблема в том, что я не смог найти, как объединить поддерево из одной ветви в 2 местоположения в том же хранилище. Мне удалось создать файловую структуру мне нужно:

git read-tree --prefix=Project_X/shared_files_dir/ -u shared_remote_branch 
git read-tree --prefix=Project_Y/shared_files_dir/ -u shared_remote_branch 

создает необходимые filestructure (точно так, как я описал в верхней части вопроса), но при попытке объединить обновление приносит мне только изменения в последнее поддерево я создал : только

git merge --squash -s subtree --no-commit shared_remote_branch 

Обновляет Project_Y/shared_files_dir /, а не Project_X/shared_files_dir/с изменениями от shared_remote_branch.

Буду признателен за любые идеи. О том, как объединить поддерево из одной отрасли в 2-х местах (Project_X/shared_files_dir /) и (Project_Y/shared_files_dir /) или как сделать это в любой другой методологии

ответ

0

С git1.8.2, вы можете зарегистрировать submodule как following the latest commits of a given branch.

Поэтому я бы рекомендовал этот подход более поддерева одного, так как она позволяет:

  • поддерживать отдельную историю в shared_files репо
  • легко обновить до последней фиксации ветви

    git submodule update --remote 
    

Вы можете даже convert an existing submodule in order to have it trakc the latest of a branch.


OP выбрал simpler solution:

Я решил использовать обходной путь:

  • управлять общими модулями в отдельном репо и
  • добавить post-checkout крюк мое основное репо, которое скопирует эти общие файлы из общего репо на основное репо.

Мы небольшая команда, так что этот подход является самым простым для нас

+0

Спасибо за ваш ответ. Я не хотел использовать подмодули из-за большого количества проблем с ними в Интернете (например, потеря ваших изменений при обновлении подмодуля git). Поэтому я задавался вопросом, могут ли быть дополнительные решения .... – user2924714

+0

@ user2924714 Я понимаю, но я уже несколько месяцев использую подмодули (как в моем проекте: https://github.com/VonC/compileEverything/blob/master/ .gitmodules # L10-L13, где подмодуль Semantic-UI следует за «мастером»), и с последней версией git все эти проблемы были решены или серьезно смягчены. – VonC

+0

Пытался использовать подмодули, я все еще вижу, что это накладные расходы, и есть слишком много вариантов ошибок. Знаете ли вы, можно ли выполнить его с помощью поддеревьев? (См. Оригинальный вопрос: мне не удалось слить поддерево из одной ветви в 2 местоположения в том же репозитории. Мне удалось создать нужную структуру файлов: git read-tree --prefix = Project_X/shared_files_dir/-u shared_remote_branch git read -tree --prefix = Project_Y/shared_files_dir/-u shared_remote_branch НО: git merge --squash -s поддерево --no-commit shared_remote_branch Обновляет только Project_Y/shared_files_dir, а не оба – user2924714