Git LFS не извлекает sh файлы LFS, если я не укажу их с идентификатором объекта - PullRequest
0 голосов
/ 22 января 2020

У меня есть репозиторий, размещенный на Azure DevOps, который использует LFS. При отправке коммита новый объект LFS не выдвигается вместе с ним (если я извлекаю изменения в отдельном репозитории, он выдает Smudge Error: Object does not exist on server [404]).

Единственный способ для объекта LFS - это нажать сделать это вручную, указав идентификатор объекта:

git lfs push origin --object-id ae488...

Вот мой git config -l:

$ git config -l
http.sslcainfo=C:/Users/200207121/AppData/Local/Programs/Git/mingw64/ssl/certs/ca-bundle.crt
http.sslbackend=openssl
diff.astextplain.textconv=astextplain
core.autocrlf=true
core.fscache=true
core.symlinks=false
core.editor="C:\\Program Files\\Notepad++\\notepad++.exe" -multiInst -notabbar -nosession -noPlugin
credential.helper=manager
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
user.email=<omitted>
user.name=<omitted>
alias.lg=log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
http.sslverify=false
diff.tool=default-difftool
difftool.default-difftool.cmd=code --wait --diff $LOCAL $REMOTE
merge.tool=vscode
mergetool.vscode.cmd=code --wait $MERGED
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
remote.origin.url=https://.../MyRepo/_git/MyRepo
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
lfs.https://dev.azure.com/.../MyRepo.git/info/lfs.access=basic
lfs.https://dev.azure.com/.../MyRepo/info/lfs/objects/.access=basic
branch.7_1_0.remote=origin
branch.7_1_0.merge=refs/heads/7_1_0
branch.7_1_A.remote=origin
branch.7_1_A.merge=refs/heads/7_1_A
branch.atvcm01008318_text_class.remote=origin
branch.atvcm01008318_text_class.merge=refs/heads/text_class
branch.atvcm01008824.remote=origin
branch.atvcm01008824.merge=refs/heads/atvcm01008824
branch.atvcm01000423.remote=origin
branch.atvcm01000423.merge=refs/heads/atvcm01000423
gui.wmstate=normal
gui.geometry=1272x626+-5+0 254 315

Чтобы предотвратить указание c ветви от нажимая, я добавил эти строки в pre-push hook. В данный момент я не проверен в этой ветке, и LFS, которую я пытаюсь сделать pu sh, также не входит в эту ветку (поэтому я не подозреваю, что это может быть вызвано этим хуком):

#!/bin/sh

### Prevent pushing test branch
if [[ `grep 'testing_AA'` ]]; then 
  echo "You really don't want to push this branch. Aborting."
  exit 1
fi
### End of edition

command -v git-lfs >/dev/null 2>&1 || { echo >&2 "\nThis repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting .git/hooks/pre-push.\n"; exit 2; }
git lfs pre-push "$@"

Почему я должен указывать git lfs push --object-id <oid> для LFS, который будет выдвинут?

1 Ответ

0 голосов
/ 24 января 2020

Способ, которым работает ловушка pre-push, заключается в считывании строк из стандартного ввода, которые указывают, какие ссылки нужно нажать и каковы их старые и новые значения. Как и ваш скрипт, git lfs pre-push работает как ловушка pre-pu sh и ожидает эти данные на своем стандартном вводе. Затем он определяет, какие объекты LFS должны быть переданы на основе этого, и выталкивает их.

То, что делает ваш хук pre-push, читает все стандартные входные данные с grep. Затем он вызывает git lfs pre-push без ввода. Так как Git LFS считает, что нет никаких ссылок на pu sh (поскольку ни один не был предоставлен на его стандартном входе), он ничего не выдвигает.

Если вы хотите прервать в случае, если вы нажимаете Если указать c ref, то вам нужно, чтобы ваш pre-pu sh хук анализировал стандартный ввод по одной строке за раз, прерывая, если вы соответствуете строке, и добавляя его к будущему вводу в git lfs pre-push, если вы не «т. Так что-то вроде следующего:

#!/bin/sh

INPUT=""

while read line
do
    if echo $line | grep -qs 'testing_AA'
    then
        echo "You really don't want to push this branch. Aborting." >&2
        exit 1
    fi
    INPUT="$INPUT $line"
done

printf "%s %s %s %s\n" $INPUT | git lfs pre-push
...