jimporter / mike

Manage multiple versions of your MkDocs-powered documentation via Git
BSD 3-Clause "New" or "Revised" License
547 stars 47 forks source link

Support for Git LFS? #176

Closed aleray closed 1 year ago

aleray commented 1 year ago

Hi,

I'm making a website that will have a couple of potentially heavy images/binaries.

I'm using Git LFS and it works well except that it seems to not be taken into account when I use mike deploy: the binaries are not managed by Git LFS and pushed as binaries instead.

I checked out my gh-pages and added .gitattributes with the appropriate extensions ("*.jpg") and did a manual commit/push but it doesn't help.

Any idea?

Thanks a lot

aleray commented 1 year ago

I assume it has to do with the fact that Mike is actually using git fast-import with a Stream File it creates by reading the actual content of the files (including binaries). So the git lfs filter is by-passed.

https://github.com/jimporter/mike/blob/master/mike/git_utils.py#L301

What do you think?

aleray commented 1 year ago

Ugly quick test with hardcoded .jpg extension and a change of the signature, but it seems to work:

    def add_file(self, file_info, original=None):
        self._write('M {mode:06o} inline {path}\n'.format(
            path=git_path(file_info.path), mode=file_info.mode
        ))

        if file_info.path.endswith(".jpg"):
            cmd = ['git', 'lfs', 'pointer', '--file={}'.format(original.path)]
            p = sp.run(cmd, stdout=sp.PIPE, stderr=sp.PIPE, universal_newlines=True)
            if p.returncode != 0:
                raise GitError('error getting lfs pointer', p.stderr)

            data = p.stdout.strip()
            self._write_data(data)
        else:
            self._write_data(file_info.data)
jimporter commented 1 year ago

Sorry, but I don't intend to support this directly (maybe #161 could provide the necessary hooks for this, but then again maybe not). Mike is already quite a bit more complex than I ever wanted it to be, and given that Git LFS isn't even the only way of storing large binaries with Git, I'd prefer not to open this particular can of worms.

Instead, I'd recommend hosting your large binaries elsewhere (ideally not in a Git branch at all), such as by using Github releases and just linking to them. If you're deploying this site to some non-Github location (e.g. your own server), I'd recommend using something other than mike entirely. You could probably make a better solution than this without too much work: one that doesn't shove build artifacts (including generated HTML docs) into a Git branch, which really isn't the ideal place for them. (Of course, you could still use the versions.json management code from mike so that things work smoothly with your theme.)

If you're dead-set on using mike and storing large binaries with Git LFS in your gh-pages branch, then I'd recommend managing those binaries separately from mike. You could add an assets directory to the root of your gh-pages branch and add+commit any binary files you want to that directory using the normal Git commands.