Автоматически отправлять изменения в одну папку в репозитории git на github?

StackOverflow https://stackoverflow.com/questions/2254687

Вопрос

У меня есть репозиторий, в котором я работаю.Там есть одна папка, куда я помещаю все материалы, которые хочу использовать с открытым исходным кодом, чтобы они были отделены от личных частей.Есть ли способ автоматически заставить git отправлять все, что записано в эту папку, в репозиторий github, без того, чтобы мне приходилось каждый раз не забывать помещать туда недавно измененные файлы?Я хочу перенести весь репозиторий в другое место на github.

Это было полезно?

Решение

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

Если у вас есть как репозиторий с "общедоступными" файлами, так и репозиторий с "частными" файлами, вы можете добавить git-хук в "общедоступное" репозиторий для автоматической отправки коммитов и просто сохранить частное репозиторий закрытым.

Однако вы пишете, что у вас есть единый репозиторий, содержащий как "общедоступные", так и "приватные" файлы, поэтому вам нужно каким-то образом разделить его на что-то "общедоступное" и что-то "приватное".

У вас есть несколько вариантов решения этой ситуации:

  1. Выделите "общедоступную" папку в отдельный репозиторий, который вы отправите на github.Это немного перепишет историю "общедоступной" папки.Я обрисую это более подробно ниже.

  2. Создайте ветку, которая касается только папки "public", и публикуйте только эту ветку.Это рискованно при "случайном нажатии, т.е.публиковать, личные материалы" смысл, и совершенно невозможно или, по крайней мере, довольно сложно сделать, если у вас есть любые коммиты, которые касаются как "общедоступных", так и "частных" файлов, поэтому я бы советую отказаться от этого варианта и не буду больше писать об этом.

Чтобы разделить "общедоступную" папку на ее собственный репозиторий, создайте новую "общедоступную" ветвь от вашей "объединенной" ветви и используйте git filter-branch на нем, чтобы новая "общедоступная" ветка содержала только материалы из "общедоступной" папки.В разделе "Примеры" показан только правый пример --subdirectory-filter).Тогда у вас будет как ваша старая "объединенная" ветвь с "общедоступной" папкой и личными данными в ней, так и новая "общедоступная" ветвь только с "общедоступной" папкой.

Имейте в виду , что , например,сообщения о фиксации в новой "общедоступной" ветви по-прежнему могут содержать "частную" информацию.Таким образом, вы должны просмотреть все сообщения о фиксации, просканировать их на предмет личной информации и, возможно, отредактировать эту личную информацию, напримерс git rebase -i.

Обновить: [Последующий толчок Только "общедоступная" ветвь и ничто другое, вероятно, не будет передавать никакой другой информации, поэтому эта очистка репо, вероятно, не нужна.] Если вам понадобилось внести какие-либо изменения, вы захотите удалить старые неотредактированные версии из репозитория, используя git gc (вероятно, с помощью --prune=0 и --aggressive варианты - но я не могу найти ответ SO с дополнительной информацией об этом).

Теперь ваша "общедоступная" ветка готова к публикации.Чтобы убедиться, что он содержит только "общедоступную" информацию, вы можете поместить его в новое пустое локальное репозиторий, изучить его содержимое, чтобы убедиться, что все ссылки не содержат личной информации.После того, как вы будете удовлетворены, вы можете перенести "общедоступную" ветку в новое пустое репозиторий на github.Тогда репозиторий на github будет содержать ТОЛЬКО "общедоступную" ветвь, которую вам, вероятно, следует назвать "master" в репозитории github.

Ваше локальное репозиторий с "объединенной" веткой по-прежнему содержит как общедоступную, так и частную информацию напрямую и не имеет никакого отношения к новому "общедоступному" репозиторию github.

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

Если интеграция между вашими личными и общедоступными файлами очень тесная и зависит от версии, вы можете использовать git submodule чтобы добавить определенную версию "публичного" репозитория с github в ваш личный репозиторий.Новая папка подмодуля, названная точно так же, как и прежняя папка "public", сведет к минимуму изменения в ваших личных материалах, так как тогда все файлы "public" будут находиться по их старому пути.Обратите внимание, что папка подмодуля не будет обновляться автоматически, когда что-то было отправлено на github.Вы могли бы обойти это, добавив git-хук в вашу локальную папку подмодулей, который обновил бы информацию о подмодуле в "объединенном" репозитории.

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

Другие советы

Используйте гитхук чтобы нажать на фиксацию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top