Патчи Git format-patch не могут использовать LFS в разных репозиториях
В настоящее время мы мигрируем из CVS в репозиторий git. Однако одна команда уже использовала cvs2git около года назад для своего репозитория, потому что их новая функция требует большого количества перемещаемых файлов с историей, с которой CVS исторически не очень хороша. Затем оба репозитория должны использовать GIT-LFS для наших больших проверенных источников (например, предварительно созданных внешних библиотек)
Идея заключалась в том, чтобы создать ту же отправную точку для объединения всех их изменений с историей в нашем хранилище после миграции.
Так что у меня уже есть точная копия отправной точки; Идея заключалась в том, чтобы создать все файлы патчей с помощью git format-patch. Сейчас большинство исправлений работают нормально, проблема только в исправлениях, использующих git lfs.
пример:
diff --git a/Foo/bar/baz.zip b/Foo/bar/baz.zip
new file mode 100644
index 00000000000..6fce3f4bd05
--- /dev/null
+++ b/Foo/bar/baz.zip
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c90b657621e07fa40476186d94e2f6e06f055b49294b83ee976f73dfac120d86
+size 116056
--
2.13.2.windows.1
когда я пытаюсь применить этот патч, происходит следующее:
$ git am ../patches/mypatch.patch
Applying: #someTfsId: myCommit
Downloading Foo/bar/baz.zip (113.34 KB)
Error downloading object: Foo/bar/baz.zip (c90b657): Smudge error: Error opening media file.: open D:\repositories\myrepo\.git\lfs\objects\c9\0b\c90b657621e07fa40476186d94e2f6e06f055b49294b83ee976f73dfac120d86: The system cannot find the file specified.
Errors logged to D:\repositories\myrepo\.git\lfs\objects\logs\20171006T110837.3254847.log
Use `git lfs logs last` to view the log.
error: external filter 'git-lfs filter-process' failed
fatal: Foo/bar/baz.zip: smudge filter lfs failed
user@machine MINGW64 /d/repositories/myrepo (develop|AM 1/1)
$ git am --abort
моей следующей идеей было использовать исходный репозиторий и получить все объекты lfs с GIT_TRACE=1 git lfs fetch - все впоследствии я попытался скопировать этот один объект (для целей тестирования), что привело к
user@machine MINGW64 /d/repositories/myrepo (develop)
$ git am ../patches/mypatch.patch
error: Foo/bar/baz.zip: already exists in working directory
Applying: #someTfsId: myCommit
Patch failed at 0001 #someTfsId: myCommit
The copy of the patch that failed is found in: .git/rebase-apply/patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
Поэтому я полагаю, что вопрос заключается в следующем: могу ли я добавить объекты LFS на удаленный сервер, или мне нужно "un-lfs" репозиторий, который используется для создания файлов.patch, чтобы сохранить двоичные различия в.patch файлах?
Мы действительно хотим сохранить историю, и на данный момент количество патчей составило бы около 1600 коммитов, что было бы трудно сделать вручную.
Если я упускаю какой-то очевидный способ, я рад за любой конструктивный вклад
1 ответ
Я знаю, что этот вопрос довольно старый, но я столкнулся с этим сценарием сегодня.
Так я решил проблему, возможно, есть способ получше, но у меня это сработало.
Основные шаги:
- зафиксировать (но не продвигать) свои изменения
- lfs переносит файлы, которые в противном случае были бы помещены в lfs
- отменить фиксацию (при условии, что вы хотите, чтобы ваши файлы были в LFS)
- вернуть изменения в .gitattribute для файлов, которые вы хотите в LFS
- повторно отправить файлы
Примечание: любая незавершенная работа будет потеряна на шаге 2, поэтому будьте осторожны.
Допустим, у меня есть файл с именем opensrc / src / make-4.3.tar.gz в репозитории, и я нахожусь на верхнем уровне репозитория. Я хочу создать патч, который включает этот файл и другие файлы, которые были изменены вместе с ним, но мои отслеживаемые файлы:
[root@localhost]# git lfs track
Listing tracked patterns
*.gz (.gitattributes)
*.sbr (.gitattributes)
*.tgz (.gitattributes)
*.exe (.gitattributes)
Listing excluded patterns
Продолжайте и добавьте и зафиксируйте свои файлы, которые будут частью патча. Вы можете узнать, какие файлы будут в LFS, выполнив:
[root@localhost]# git lfs status
On branch master
Objects to be pushed to origin/master:
opensrc/src/make-4.3.tar.gz (e05fdde47c5f7ca45cb697e973894ff4f5d79e13b750ed57d7b66d8defc78e19)
Objects to be committed:
Objects not staged for commit:
Поэтому перед созданием патча я добавляю этот файл (и любые другие) в список исключений:
[root@localhost]# git lfs migrate export --include opensrc/src/make-4.3.tar.gz
migrate: override changes in your working copy? All uncommitted changes will be lost! [y/N] y
migrate: changes in your working copy will be overridden ...
migrate: Fetching remote refs: ..., done.
migrate: Sorting commits: ..., done.
migrate: Rewriting commits: 100% (1/1), done.
master 526f3a2488679349653bea096fc311c5f42c38dd -> 3734d32f6226c542f470e252aedfcafd5e0950cf
migrate: Updating refs: ..., done.
migrate: checkout: ..., done.
prune: 341 local object(s), 341 retained, done.
e05fdde47c5f7ca45cb697e973894ff4f5d79e13b750ed57d7b66d8defc78e19 (2.3 MB)
e05fdde47c5f7ca45cb697e973894ff4f5d79e13b750ed57d7b66d8defc78e19 (2.3 MB), done.
prune: Deleting objects: 100% (1/1), done.
Теперь снова проверяем статус lfs:
[root@localhost]# git lfs status
On branch master
Objects to be pushed to origin/master:
Objects to be committed:
Objects not staged for commit:
а теперь создаем патч:
[root@localhost]# git format-patch HEAD -1
0001-Update-make.patch
[root@localhost]# **ls -l 0001-Update-make.patch**
-rw-r--r--. 1 root root 2986800 Oct 21 18:44 0001-Update-make.patch
Теперь вы можете отменить изменение LFS и повторно подтвердить оригинал, чтобы ваш файл оказался в LFS:
[root@localhost]# git reset HEAD^
Unstaged changes after reset:
M .gitattributes
M opensrc/Makefile
M opensrc/config.common.mk
M opensrc/rootproject/Makefile
[root@localhost]# git diff .gitattributes
diff --git a/.gitattributes b/.gitattributes
index 893a1726c..f94922c84 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -12,3 +12,4 @@
*.sbr filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.exe filter=lfs diff=lfs merge=lfs -text
+opensrc/src/make-4.3.tar.gz !text !filter !merge !diff
[root@localhost]# git checkout .gitattributes
Updated 1 path from the index
[root@localhost]# git add .
[root@localhost]# git commit -v -s
ПРИМЕЧАНИЕ: ваш патч также исключит файл (ы) из LFS, поэтому вам, возможно, придется исправить это, сбросив фиксацию, отредактировав .gitattributes, а затем повторно подтвердив