Управление полезными дубликатами файлов в Git - PullRequest
1 голос
/ 23 марта 2012

Я новичок в Git и хотел бы знать, как лучше всего обрабатывать дубликаты файлов.

Предположим, у меня есть следующая структура каталогов Git:

myProject/
myProject/Server/
myProject/AndroidApp/

Как на сервере /, так и на AndroidApp / есть несколько общих файлов (например, MyUtilities.java). Я думаю, что набор общих файлов достаточно мал, чтобы исключить создание отдельного пакета или каталога для них. Теперь я действительно не хочу создавать две копии каждого файла, но по сути Server / MyUtilities.java должен совпадать с AndroidApp / MyUtilities.java. Что мне делать?

Ответы [ 4 ]

3 голосов
/ 23 марта 2012

Если это один и тот же файл, вам лучше сделать символическую ссылку из одного:

Пример в Linux / OSX ln -s myProject/Server/MyUtilities.java myProject/AndroidApp/MyUtilities.java

1 голос
/ 23 марта 2012

Не занимает дополнительного места, если файл в хранилище дублируется.Это связано с тем, что хранилище git является адресно-ориентированной системой (т. Е. Тот же хэш для этого дублированного файла).

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

1 голос
/ 23 марта 2012

Вы должны управлять этим, основываясь на структуре вашего проекта, а не на том, как Git справится с этим.

Первый вопрос, который вы должны задать себе: если вы внесете изменение в myProject/Server/MyUtilities.java, сделаете ли вывсегда хотите внести одно и то же изменение в myProject/AndroidApp/MyUtilities.java?

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

И ты можешь передумать позже;если вы обнаружите, что AndroidApp нужна другая версия, вы всегда можете изменить положение вещей.

Как я уже сказал, не беспокойтесь о Git.Внутренне файлы в Git-хранилище хранятся в зависимости от их содержимого;имя файла - это контрольная сумма sha1 содержимого файла.(Это не так просто, но почти так.) Если два файла совпадают, Git сохранит одну копию и при необходимости будет обращаться к ней.Если вы измените одну копию, ссылки будут обновлены, но более старая версия, к которой вы все еще можете получить доступ, по-прежнему ссылается на одну копию.Конечно, у вас будет две копии в вашей рабочей области, но сам Git хранит только одну.

Символические ссылки - заманчивая идея, и они, безусловно, могут быть полезны (а Git обрабатывает символические ссылки), но я думаю,что либо сохранение двух копий файла, либо помещение одной копии в общий каталог, вероятно, будет лучшим решением.

РЕДАКТИРОВАТЬ: Чтобы уточнить, что я предлагаю, я думаю, чтолучший подход - иметь только одну копию любых логических файлов - без дубликатов, без символических ссылок.

Например, вы можете создать новый каталог Common, содержащий MyUtilities.java:

myProject/Common/MyUtilities.java
myProject/Server/ServerFoo.java
myProject/AndroidApp/AndroidBar.java

Я не очень хорошо знаком с Java, но я полагаю, что он дает вам некоторый способ ссылаться на вещи в другом файле, не располагая этим файлом в том же каталоге.Другими словами, вам вообще не нужно myProject/Server/MyUtilities.java, ни в качестве копии, ни в виде символической ссылки;просто обратитесь к myProject/Common/MyUtilities.java из myProject/Server/ServerFoo.java.

Это имеет больше смысла?

1 голос
/ 23 марта 2012

Вы должны сделать то, что сказали сами: создайте отдельный каталог для общих файлов.

Или вы можете попробовать запустить Git поверх файловой системы со встроенной дедупликацией!

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