как перебазировать с помощью git lfs?

У меня есть репозиторий с двумя отслеживаемыми файлами lfs. Я переношу это репо в репоВ вот так

cd repoB
git fetch repoA somebranch
git checkout -b temp FETCH_HEAD
git rebase someotherbranch

это печатает несколько строк Apply: ... и затем

Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
error: Your local changes to the following files would be overwritten by merge:
    Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes
Please, commit your changes or stash them before you can merge.
Aborting
error: Failed to merge in the changes.
Patch failed at 0340 update server
The copy of the patch that failed is found in: .git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

Как это исправить? ПРИМЕЧАНИЕ: ЭТОГО ФАЙЛА НЕ СУЩЕСТВУЕТ В репозитории. Эта проблема, похоже, полностью связана с проблемами с git lfs.

git статус показал это

$ git status
rebase in progress; onto 5af1f30
You are currently rebasing branch 'gamepad' on '5af1f30'.
  (all conflicts fixed: run "git rebase --continue")

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes
    deleted:    Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.sha256.bytes

no changes added to commit (use "git add" and/or "git commit -a")

Примечание. Я попытался просто добавить и зафиксировать 2 файла (voodoo), а затем git rebase --continue, что продолжалось до тех пор, пока в следующий раз файл не был изменен в истории, после чего возникла аналогичная ошибка. Я сделал то же самое, и это, наконец, закончилось. Но затем, когда я попытался перебазировать это на другую ветку, я получил

Downloading Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes (7.48 MB)
Error downloading object: Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes (4743b094eeab821140773213ebabdaa81c9ac2eb1be1108e70e8d51ae52873dd)

Errors logged to /Users/gregg/src/hft-unity3d/.git/lfs/objects/logs/20160603T213456.110362284.log
Use `git lfs logs last` to view the log.
error: external filter git-lfs smudge -- %f failed 2
error: external filter git-lfs smudge -- %f failed
fatal: Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes: smudge filter lfs failed
Could not apply dc378b5d715103e9af0ee805ff2a3be1159739aa... add lfs support

Что предполагает, что я понятия не имею, как правильно использовать git lfs.

обновление 1

Получается, что вам нужно установить git lfs в каждом репо. Это совсем не ясно из документов, в которых говорится

Вам нужно настроить Git LFS только один раз.

 git lfs install

Оказывается, это один раз на репо, а не один раз.

Затем, прочитав проблемы, нужно узнать, где взять удаленно сохраненные файлы. Он делает это на основе того, какая удаленная ветвь отслеживается, поэтому, начиная с

git clone [email protected]/me/repoA
cd repoA
git lfs install
git remote add repoB [email protected]/me/repoB
git fetch repoB
git checkout -b temp repoB/somebranch

Это начинает извлекать repoB/somebranch во временный файл, но терпит неудачу с

Downloading Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes (7.48 MB)
Error downloading object: Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes (f8c42a7c55f610768ce50ff93d09fc63fa897de867290dafee2e84d64e10de4e)

Errors logged to /Users/gregg/temp/delme-hft-unity3d/.git/lfs/objects/logs/20160603T231351.670335751.log
Use `git lfs logs last` to view the log.
error: external filter git-lfs smudge -- %f failed 2
error: external filter git-lfs smudge -- %f failed
fatal: Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes: smudge filter lfs failed

Насколько я знаю, сейчас я отслеживаю правильную ветку. Это та же ветка на том же удаленном компьютере, с которого были загружены файлы.

обновление 2

Начнем с последнего, но изменим origin, чтобы он указывал на repoB после клонирования repoA.

git clone [email protected]/me/repoA
cd repoA
git lfs install
git remote remove origin
git remote add origin [email protected]/me/repoB
git fetch repoB
git checkout -b temp origin/somebranch

Это работает там, где раньше это не сработало

Но сейчас

git checkout -b other master
git branch --set-upstream-to origin/somebranch
git rebase master temp

Сбой в том же месте, что и раньше

Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
error: Your local changes to the following files would be overwritten by merge:
    Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes
Please, commit your changes or stash them before you can merge.
Aborting
error: Failed to merge in the changes.
Patch failed at 0358 update server
The copy of the patch that failed is found in: .git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

person gman    schedule 03.06.2016    source источник
comment
Почему за это минусуют. git-lfs относительно новый. Документы скудные. Не кажется ли вероятным, что другие люди столкнутся с этими проблемами, поскольку они становятся все более популярными и нуждаются в решении?   -  person gman    schedule 03.06.2016


Ответы (2)


Хорошо, очевидно, проблема в том, что когда git вызывает перехватчики, он не передает текущую информацию о ветке отслеживания, поэтому lfs не может найти файлы. Просто по умолчанию используется ссылка origin

Поэтому для этого вам нужно установить lfs с опцией --skip-smudge. это в основном скажет lfs не загружать файлы. Сделайте слияния, как и ожидалось, затем git lfs pull, у которого есть удаленный параметр, чтобы вы могли указать, где взять файлы.

Как только все это будет сделано, я предполагаю, что вы можете ввести git lfs install, чтобы вернуть его в нормальное состояние. Вам, вероятно, нужно выполнить git lfs fetch --all repoB и git lfs push --all repoA somebranch, чтобы получить все файлы, которые вы скачали из хранилища lfs предыдущего репо (repoB), в хранилище lfs нового репо (repoA)

все шаги из этой проблемы github

# This disables smudging for the 'git clone'
# and then calls 'git lfs pull' for you
git lfs clone [email protected]:me/repoB.git
cd repoB
git lfs install --skip-smudge --local # affects only this clone

git fetch repoA
git checkout -b temp repoA/somebranch
git rebase master

git lfs fetch --all repoA
git lfs checkout
git push origin temp

git lfs push --all origin temp
git lfs install --force --local

Команда git lfs pull по существу аналогична вызову git lfs fetch (загружает объекты LFS) и git lfs checkout (копирует локально загруженные файлы в ваш рабочий каталог). Итак, мой пример загружает объекты только через команду git lfs fetch --all.

Если вы хотите отключить фильтр смазывания для одной команды, вы также можете использовать GIT_LFS_SKIP_SMUDGE:

$ GIT_LFS_SKIP_SMUDGE=1 git pull
$ git lfs pull
person gman    schedule 03.06.2016
comment
У меня это работало в несколько ином порядке, но ключ был в том, чтобы ``` git lfs install --skip-smudge --local # сделать любую команду git, которая терпела неудачу, для меня это было проверить выбранную ветку git lfs checkout # возьмите файлы lfs, связанные с проверкой git lfs install --force --local # переустановите обычное использование lfs ``` - person Jock; 01.03.2019

Коммит от repoA изменил файл Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes.

Этот же файл также находится в рабочем дереве repoB. Git знает, что не может заменить файл. Чтобы исправить это, вы должны сделать то, что предлагает git. Git часто говорит вам, как исправить ошибку.

Спрячьте или зафиксируйте свои локальные изменения. В вашем случае кажется лучше спрятать ваши изменения, сделать перебазирование, вытащить тайник. Это даст вам следующие команды.

cd repoB
git stash
git fetch repoA somebranch
git checkout -b temp FETCH_HEAD
git rebase someotherbranch
git stash pop // You may need to resolve conflict using git mergetool

Прежде чем начать, обязательно избегайте предыдущих попыток перебазирования.

person Flows    schedule 03.06.2016
comment
спасибо, но этого файла вообще нет в repoA. Полный путь не существует в repoA. Ошибка как-то связана с git lfs (или я предполагаю). Вы можете увидеть repoA здесь в состоянии до того, как я заставил это работать. Вы можете видеть, что в корне нет папки Assets. - person gman; 04.06.2016