diff --git a/docs/administration/git-lfs-support.md b/docs/administration/git-lfs-support.md index 4a390721..c26e9527 100644 --- a/docs/administration/git-lfs-support.md +++ b/docs/administration/git-lfs-support.md @@ -41,3 +41,24 @@ client that causes SSH transfers to hang: https://github.com/git-lfs/git-lfs/pul This can be worked around on all the client machines by setting the git config: `git config --global lfs.ssh.automultiplex false` ::: + +# Changing LFS files through the API + +The [contents API](https://docs.gitea.com/api/operations/repo-change-files/) +works on LFS tracked files as well: send the file content as usual and Gitea +stores it as an LFS object and commits a pointer file, as long as the path is +matched by a `filter=lfs` rule in `.gitattributes`. + +What is easy to get wrong is the `sha` of the file being changed, which +`PUT`/`DELETE /repos/{owner}/{repo}/contents/{filepath}` and +`POST /repos/{owner}/{repo}/contents` require for an existing file. Gitea +compares it with the ID of the blob the commit has at that path, and for an LFS +tracked file that blob is the **pointer file**, not the content: + +- use the `sha` returned by + [`GET /repos/{owner}/{repo}/contents/{filepath}`](https://docs.gitea.com/api/operations/repo-get-contents/) +- do not use `lfs_oid` from the same response, which identifies the LFS object, + and do not use a checksum of the file itself + +Sending anything else fails with `sha does not match`, even though the request +looks correct.