Saya telah memigrasikan file besar di repositori git saya ke git-lfs. Repositori berisi kode sumber pustaka python khusus. Saya dapat menginstalnya dengan pip:

pip install git+https://gitserver.com/myrepo.git@branch

Saat ini (setelah migrasi), file besar yang disimpan di lfs, jelas, keluar dari instalasi (hanya ada tautan). Saya telah menginstal paket git-lfs dari PyPI di lingkungan tetapi tidak membantu.
Apakah ada cara untuk memberi tahu pip untuk mengambil file git-lfs saat mengkloning repo?

1
loven-doo 31 Mei 2019, 13:29

2 jawaban

Jawaban Terbaik

Jika Anda memiliki pengaturan konfigurasi per pengguna atau sistem yang diatur dengan benar, maka Git akan secara otomatis memanggil Git LFS saat mengkloning repositori yang menggunakan Git LFS.

Cara termudah untuk melakukannya adalah dengan menjalankan git lfs install --skip-repo, yang akan memodifikasi .gitconfig Anda untuk memuat entri yang tepat. Anda dapat memverifikasi bahwa konfigurasi Anda sudah benar dengan menjalankan git lfs env dan memastikan bahwa tiga opsi git config terakhir yang dicetak tidak kosong.

Setelah itu diatur, setiap kali Anda mengkloning repositori baru menggunakan Git LFS, file LFS akan diambil dan diisi secara otomatis. Jika Anda memiliki repositori yang sudah ada, Anda dapat menggunakan git lfs checkout untuk memeriksa file secara manual.

1
bk2204 1 Juni 2019, 01:32

Saya menemukan masalah yang sama di mana saya memiliki beberapa paket python internal yang berisi file LFS. Masing-masing dari mereka memiliki file requirements.txt dan setup.py sendiri di mana satu didasarkan pada pip dan tidak menangani git lfs dengan baik dan yang lainnya didasarkan pada setuptools...

requirements.txt saya terlihat seperti:

pip_package1==0.1
pip_package2==0.2
pip_package3==0.3
git+ssh://git@{url}:{port}/{repo}.git@{branch}

Dalam setup.py solusinya adalah menangkap git+ssh apa pun untuk tidak membiarkannya masuk ke fungsi setup tetapi memaksa pemasangannya melalui pip:

def install_requires():
    reqdir = os.path.dirname(os.path.realpath(__file__))
    with open(os.path.join(reqdir, 'requirements.txt'), encoding='utf-8') as f:
        all_packages = f.readlines()
        packages = [
            package
            for package in all_packages
            if 'git+ssh' not in package
        ]
        manual_pip_packages = [
            package
            for package in all_packages
            if 'git+ssh' in package
        ]
        for package in manual_pip_packages:
            subprocess.call([sys.executable, '-m', 'pip', 'install', package])
    return packages

Kemudian kompatibilitas pip / git lfs. Apa yang saya pahami adalah pip install pada git repo hanya akan git clone dan kemudian python setup.py [something] jadi saya menambahkan di setiap setup.py dalam paket yang berisi file lfs git pull seandainya setup.py yang bersangkutan ada di dalam repositori git.

def pull_first():
    """This script is in a git directory that can be pulled."""
    cwd = os.getcwd()
    gitdir = os.path.dirname(os.path.realpath(__file__))
    os.chdir(gitdir)
    g = git.cmd.Git(gitdir)
    try:
        g.execute(['git', 'lfs', 'pull'])
    except git.exc.GitCommandError:
        raise RuntimeError("Make sure git-lfs is installed!")
    os.chdir(cwd)

Dengan begitu saya memiliki setup.py:

from setuptools import setup, find_packages

import os
import subprocess
import sys

try:
    import git
except ModuleNotFoundError:
    subprocess.call([sys.executable, '-m', 'pip', 'install', 'gitpython'])
    import git


def install_requires():
    ...


def pull_first():
    ...


pull_first()

setup(name=...,
      version=...,
      description=...,
      long_description=...,
      url=...,
      author=...,
      license=...,
      packages=find_packages(),
      python_requires=">=3.0",
      install_requires=install_requires())
3
baptiste 19 November 2019, 11:13