Как добавить файл в удаленный Git repo (Github) без клонирования всего репо первого

Этот вопрос Git очень похож на другой вопрос о SVN.

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

svn import -m "Adding just a file" file_name http://path/to/svn/repo/file_name

Как достичь этой простой задачи в Git?

Ответ 1

Это невозможно. Я только что проверил следующее:

  1. mkdir hello_independent (примечание: "hello" - мое предыдущее имя репозитория)
  2. git init (примечание: создайте репозиторий с пустым здесь)
  3. git remote set-url origin https://github.com/solio/GitPractice.git (обратите внимание: установите локальный репозиторий в удаленный репозиторий.)
  4. vim newfilefromindependentfolder.md (примечание: добавьте новый файл)
  5. git add --a
  6. git commit -m "test commit from independent folder."
  7. git push origin master (примечание: эта операция является ключом)

он покажет эту ошибку: (извините, я не могу загрузить изображение моей операции и сообщение подсказки без 10 репутации)

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

Ответ 2

Для GitHub, по крайней мере (не git), API GitHub предоставляет способ создания файла без клонирования:

https://developer.github.com/v3/repos/contents/#create-a-file

PUT /repos/:owner/:repo/contents/:path

# Parameters #
----------------------------------------------------------------
Name     Type    Description
------   ------  -----------------------------------------------
path     string  Required. The content path.
message  string  Required. The commit message.
content  string  Required. The new file content, Base64-encoded.
branch   string  Branch name. Default: repo default branch.

Минимальный пример ввода JSON:

{
  "message": "my commit message",
  "content": "bXkgbmV3IGZpbGUgY29udGVudHM="
}

Таким образом, вы можете написать скрипт для base64-кодирования содержимого файла, а затем использовать curl или такой, чтобы отправить некоторый JSON, например выше, на https://api.github.com/repos/:owner/:repo/contents/:path

Если это удастся, вы получите ответ JSON, который включает URL-адреса GitHub для созданного файла.

Можно также обновлять файлы без клонирования: https://developer.github.com/v3/repos/contents/#update-a-file

Ответ 3

Репо включает в себя набор довольно жирных двоичных файлов

Это не то, что предназначено для создания git-репо, как я объяснил здесь.

Вы не можете проталкивать что-то, не загрузившись первым, поэтому, если ваше репо не размещено в службе, которая поддерживает добавление файлов через свой веб-интерфейс ( например, GitHub, как прокомментировал heinrich5991), вы не сможете импортировать только один файл.

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