Реструктуризация Git-репо - PullRequest
0 голосов
/ 30 августа 2018

У меня есть такая структура git-репо-

main-repo
  -file1
  -file2

Я хочу преобразовать его во что-то вроде -

main-repo
   -javascript
       -file1
       -file2

, а затем добавить еще один репозиторий на другом языке, например

main-repo
    -javascript
        -file1
        -file2
    -python
        -file1
        -file2

Как это сделать, учитывая, что у меня уже есть несколько коммитов, и тесты настроены в travis.yml для запуска на push to master.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

У меня есть такая структура git-репо… Я хочу преобразовать это во что-то вроде ...

Нет ничего плохого в перемещении файлов внутри хранилища. Однако, даже несмотря на то, что Git может автоматически определять перемещения файлов (некоторые из них исчезнут, а некоторые появятся с точно таким же содержимым), для этого есть специальная команда:

git mv <source> <destination>

Файл будет автоматически перемещен, и он появится в отчете git status. Поэтому вам потребуется коммит для записи этого.

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

Предполагается, что каждый коммит не зависит от других, даже если каждый ссылается на предыдущий (или объединенный). В основном это список полностью определенных имен файлов, каждое из которых указывает на их соответствующее содержимое, что позволяет вам легко сравнивать (с git diff) любые два коммита, где бы они ни находились в графе.

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

Используя git mv, вы даете Git возможность хранить всю необходимую информацию, чтобы помочь ему в выполнении этой задачи. Кроме того, в некоторых других SCM, которые работают по-другому, это может быть обязательным.

, а затем добавить еще один репозиторий на другом языке, например

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

Это связано с тем, что, как было сказано ранее, Git рассматривает только файлы (даже если он по-прежнему может работать с символическими ссылками и специальными файлами) и отслеживает их соответствующие места, поддерживая полное имя файла (например, "/ имя_директории / базовое имя"). Поэтому он не может обрабатывать ветвь, у которой нет конца в конце.

Кроме того, если ваши каталоги "javascript" и "python" не имеют ничего общего (кроме частей данного уникального проекта), вам лучше превратить их в несколько отдельных репозиториев git. Помните, что вы всегда можете запустить новый репозиторий с помощью git init, даже если в нем уже есть что-то.

Наконец, когда вы достигли точки, когда вы хотите создать репозиторий внутри большего, например, для публичного обмена маленьким, сохраняя при этом некоторую дополнительную информацию, или при работе над большим проектом, в котором из его библиотек проект сам по себе, вы захотите проверить git submodule, но не сегодня. :)

0 голосов
/ 30 августа 2018

Самое простое - просто переместить файлы и сделать новый коммит. Этого может или не может быть достаточно. С одной стороны, конечно, у вас пока нет истории для файлов Python, которые вы собираетесь добавить, так что это освободит место для полной истории. С другой стороны, ранние истории отдельных файлов могут не всегда отображаться так, как вам бы хотелось (потому что обработка перемещений файлов в git, хотя и неплохая, не идеальна).

Другой вариант - переписать историю репо так, чтобы она всегда имела желаемую структуру каталогов. Вы можете сделать это с git filter-branch. Если репо достаточно мало, вы можете передать аргумент --tree-filter с помощью скрипта типа

mkdir javascript
mv file1 file2 javascript

(или mv *.js javascript, или что имеет смысл).

Эта операция заведомо медленная, но для относительно нового репо с только «несколькими» коммитами это должно быть разумно.

Пожалуйста, смотрите документацию по git filter-branch для более подробной информации. https://git -scm.com / Docs / ГИТ-фильтр-филиал

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...