Можно ли добавить файл в репозиторий git, не проверив его локально? - PullRequest
5 голосов
/ 24 декабря 2011

Цель: добавить новый файл в удаленный репозиторий git, не проверяя все это локально.

Почему: я создаю приложение, которое будет добавлять файлы в репозиторий пользователя git.Некоторые из этих репозиториев будут сотнями мег.Некоторые будут затронуты очень редко.Я хочу не тратить терабайты дискового пространства, чтобы держать большие репозитории проверенными, которые не будут часто затрагиваться, и я не хочу нести неизбежную задержку проверки репо на 200 МБ (много бинарных файлов), чтобыдобавьте в него новый файл и верните его в исходную точку.

Я предполагаю, что git-клиент по умолчанию НЕ МОЖЕТ этого сделать, но я надеюсь, что кто-то написал что-то, что может передать в удаленное хранилище (не важно, на каком языке), не проверив все это локально.,Обладает ли Cloud9 IDE чем-то вроде этого?

Приложение будет иметь полный доступ к git-репо пользователей через SSH или любой другой механизм, который GitHub использует для приложений oAuthed для настройки репо.

Ответы [ 5 ]

2 голосов
/ 27 декабря 2011

ПРЕДУПРЕЖДЕНИЕ: СЛЕДУЮЩИЙ ОТВЕТ НЕТ БОЛЬШЕ РАБОТЫ С НАИБОЛЕЕ ПОСЛЕДНИЕМИ ВЕРСИЯМИ GIT

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

  • Создание совершенно нового репозитория git.
  • добавьте и передайте в него новые файлы.
  • сообщите новому репо, где находится удаленное репо (git remote add ...)
  • push к удаленному репо.

Примечания. Удаленное репо должно быть либо «голым репо», либо для receive.denyCurrentBranch установлено значение «ignore» или «warn»

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

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

PS Спасибо всем, кто опубликовал возможные обходные пути.

2 голосов
/ 24 декабря 2011

Git имеет несколько опций для мелкого клонирования и частичного клонирования, но они не могут быть использованы.

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

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

2 голосов
/ 24 декабря 2011

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

Когда у вас нет доступа к оболочке, решение гораздо более хакерское. Чтобы отправить изменения в удаленное хранилище, необходимо выполнить следующие задачи:

  • создать содержимое всех файлов (= создать хэш нового файла и найти хеши неизмененных файлов [вы получаете их из текущего дерева])
  • создать дерево
  • создать коммит
  • отправка нового содержимого файла, дерева и фиксация в удаленном репо
  • нажать ветку-переместить на сервер

Я бы начал с расширения hg-git , так как я предполагаю, что есть некоторый код, который делает что-то подобное.

2 голосов
/ 24 декабря 2011

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

http://schacon.github.com/git/git-read-tree.html#_sparse_checkout

(Больше информации на Оформить заказ в Git? )

1 голос
/ 25 декабря 2011

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

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