Публичный APIРепозитории6. PUT /repos/{owner}/{repo}/contents/{filename} — создать или обновить файл

6. PUT /repos/{owner}/{repo}/contents/{filename} — Создать или обновить файл

Описание

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

⚠️ Для обновления файла обязательно указывать SHA-хеш текущей версии файла (поле sha в теле запроса).

Параметры URL

ПараметрОбязательныйОписание
ownerДаВладелец репозитория (пользователь или организация)
repoДаНазвание репозитория (без расширения .git)
filenameДаПуть к файлу в репозитории (например, docs/README.md)

Параметры запроса

Данный метод не принимает параметров в строке запроса.

Тело запроса

Тело запроса обязательно и должно быть в формате JSON. Поддерживаемые поля:

ПолеТипОбязательныйОписание
contentstringДаСодержимое файла в Base64
messagestringНетСообщение коммита (по умолчанию: "Update file via API")
branchstringНетЦелевая ветка (по умолчанию — ветка по умолчанию репозитория)
shastringТолько при обновленииSHA-хеш текущей версии файла (обязателен при обновлении)
new_branchstringНетЕсли указано — создается новая ветка на основе branch и в нее вносится изменение
signoffbooleanНетДобавить подпись Signed-off-by в коммит

При создании файла поле sha не указывается.
При обновлении — обязательно.

Пример запроса

Создать новый файл

curl -X PUT "https://api.gitverse.ru/repos/alice/my-project/contents/docs/README.md" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/vnd.gitverse.object+json;version=1" \
  -d '{
    "content": "IyBNeSBQcm9qZWN0CkhlbGxvLCB3b3JsZCE=",
    "message": "Add README",
    "branch": "main"
  }'

Обновить существующий файл

curl -X PUT "https://api.gitverse.ru/public/api/repos/alice/my-project/contents/docs/README.md" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/vnd.gitverse.object+json;version=1" \
  -d '{
    "content": "IyBNeSBQcm9qZWN0CkhlbGxvLCB1cGRhdGVkIHdvcmxkIQ==",
    "message": "Update README content",
    "branch": "main",
    "sha": "a1b2c3d4e5f67890..."
  }'

Ответ (200 OK)

Пример JSON-ответа:

{
  "content": {
    "type": "file",
    "encoding": "base64",
    "size": 35,
    "name": "README.md",
    "path": "docs/README.md",
    "content": "IyBNeSBQcm9qZWN0CkhlbGxvLCB1cGRhdGVkIHdvcmxkIQ==",
    "sha": "f9e8d7c6b5a4...",
    "url": "https://api.gitverse.ru/public/api/repos/alice/my-project/contents/docs/README.md",
    "html_url": "https://gitverse.ru/alice/my-project/blob/main/docs/README.md",
    "git_url": "https://api.gitverse.ru/public/api/repos/alice/my-project/git/blobs/f9e8d7c6b5a4...",
    "download_url": "https://gitverse.ru/alice/my-project/raw/main/docs/README.md",
    "_links": {
      "self": "https://api.gitverse.ru/public/api/repos/alice/my-project/contents/docs/README.md",
      "git": "https://api.gitverse.ru/public/api/repos/alice/my-project/git/blobs/f9e8d7c6b5a4...",
      "html": "https://gitverse.ru/alice/my-project/blob/main/docs/README.md"
    }
  },
  "commit": {
    "sha": "c1d2e3f4a5b6...",
    "html_url": "https://gitverse.ru/alice/my-project/commit/c1d2e3f4a5b6...",
    "author": {
      "name": "Alice",
      "email": "alice@example.com",
      "date": "2025-10-15T12:00:00Z"
    },
    "committer": {
      "name": "Alice",
      "email": "alice@example.com",
      "date": "2025-10-15T12:00:00Z"
    },
    "message": "Update README content"
  }
}

Формат ответа

application/vnd.gitverse.object+json;version=1

Коды ответа

КодСтатусОписание
200OKФайл успешно создан или обновлен
400Bad RequestНекорректное тело запроса, отсутствует content или неверный Base64
401UnauthorizedНе передан или недействителен токен авторизации
403ForbiddenНет прав на запись в репозиторий
404Not FoundРепозиторий или указанный branch не найдены
409ConflictSHA не совпадает с текущей версией файла (при обновлении)
422Unprocessable EntityОшибка валидации (например, попытка создать файл с уже существующим именем без sha)
500Internal Server ErrorВнутренняя ошибка сервера