Мой коллега будет работать над некоторыми проектами для меня, пока я уезжаю в отпуск, поэтому, естественно, я поделился с ним своим репозиторием, чтобы дать ему доступ к моей базе кода.
Однако там есть десятки папок, и не каждая папка в репозитории имеет для него отношение.
Я только недавно начал использовать git и не нашел в Интернете ничего, что подразумевает, что это возможно.
Как я могу поделиться только соответствующими папками в моем репозитории?
Нет простого способа сделать это. В git коммиты представляют собой полные снимки содержимого репо. Чтобы создать версию репо, содержащую только определенные папки, вам нужно будет создать новый набор коммитов только с этими папками, то есть с отдельной историей. Тогда будет сложно интегрировать работу, проделанную над этим репо, обратно в ваше исходное репо.
Это одна из причин, по которой у каждого проекта должно быть собственное репо. Термин «каждый проект» здесь немного расплывчат, но суть в том, что репо должно содержать группу активов, над которыми обычно будут работать / изменяться вместе. Люди, которые привыкли к TFVC и тому подобному, выступают за так называемые структуры «монорепозитория»; если вы используете такую структуру, вы работаете вопреки принципам git.
Если у вас есть группа связанных проектов, вы можете поместить их каждый в свое собственное репо и либо (1) использовать инструменты сборки, чтобы задокументировать зависимости и собрать их по мере необходимости (что является моей рекомендацией), либо (2) использовать подмодули.
Вот пример.
Предположим, в вашем репозитории есть 4 подпапки (foo1 foo2 foo3 foo4
), и вы хотите поделиться 2 из них (foo2 and foo4
) со своим коллегой, а ваша ветка - master
.
Дерево вашего репозитория:
.
├── foo1
├── foo2
├── foo3
└── foo4
Если вы не знакомы с git, вы можете создать новый клон, прежде чем выполнять следующие шаги. Даже если это не удастся, ваше исходное репо не будет испорчено.
1) Сделать ветку без foo1
и foo3
:
git checkout -b base master
git rm -rf foo1 foo3
git commit -m 'base for colleague'
2) Создайте бандл с начальной веткой colleague
от base
для своего коллеги:
git checkout --orphan colleague base
git commit -m 'init colleague'
git bundle create colleague.bundle colleague
3) Поделитесь файлом colleague.bundle
с коллегой. Его можно использовать как удаленный репозиторий только для чтения.
4) Ваш коллега клонирует из пакета и создает собственное репо myrepo
:
git clone <path to colleague.bundle> -- myrepo
cd myrepo
git checkout -b master origin/colleague
#in the repo, there are only foo2 and foo4
#make his/her changes to foo2 and foo4, and commit them
5) Ваш коллега дает вам свои новые коммиты, и вы их применяете. Вот один из возможных способов:
#your colleague creates a bundle 'return.bundle' and send it to you
git bundle create return.bundle master
#you fetch his/her 'master' from the bundle and apply the new commits to your own 'master'
git fetch <path to return.bundle> master:from_my_colleague
git checkout master
git cherry-pick colleague..from_my_colleague
#after all is done, you could delete those branches
git branch -D base colleague from_my_colleague
Коммитером этих новых коммитов будете вы, а их авторами - ваш коллега. Сначала вы также можете просто отправить свою ветку colleague
в реальный удаленный репозиторий и попросить своего коллегу загрузить его и создать из него master
. Но это может включать управление репозиторием, такое как создание репозитория и контроль доступа, в то время как пакет является более простым. И, наконец, ваш коллега может просто отправить свой master
в настоящий удаленный репозиторий, а затем вы загрузите его в свой репозиторий и примените новые коммиты к вашему master
.