LINUX.ORG.RU

Выборочная загрузка файлов из репозитория

 


0

1

Есть репозиторий на github, в который делаю коммиты только я. Мои коллеги делают git pull и загружают файлы на свои компьютеры.

Потом они в своих целях модифицируют часть файлов, а оставшиеся неизменными загружают из моего репозитория дальше, если есть какие-то обновления. Вопрос: могут ли они определить выборочно, какие файлы обновлять из моего репо, а какие не обновлять?

Deleted

Можно инвертировать: сказать гиту игнорировать изменения части файлов. Тогда git pull или любая (ну почти) другая команда git на них не будет влиять. Главное не забывать, что эти файлы игнорируются, а то потом можно долго сидеть и искать, что не так.

Игнорировать файл:

git update-index --skip-worktree file1 file2 ...

Не игнорировать файл:

git update-index --no-skip-worktree file1 file2 ...

Есть ещё --assume-unchanged, но разницу между ними не помню, так что читать git help update-index.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Проверил, и вот что получилось.

git update-index --skip-worktree file1

Изменил файл на github и сделал git pull в локальный репозиторий. И изменения всё равно загрузились. Далее решил сначала изменить локальный файл file1. Сделал git status и изменений не увидел. Затем изменил файл на github. Попытался сделать git pull и получил ответ:

error: Your local changes to the following files would be overwritten by merge:
        file1
Please, commit your changes or stash them before you can merge.
Aborting

Не работает, выходит.

Deleted
()
Ответ на: комментарий от Deleted

Там наоборот, можно сказать локальный ignore. Т.е. после

git update-index --skip-worktree dir/*

for file in dir/* ; do echo $RANDOM >$file ; done

команда git status скажет, что ничего не поменялось.

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)

Я до конца не уверен, но считаю, что частично загружать коммиты не получится: внутренности git таковы, всё — это обьекты и связи. Нарушение связей — ошибка. То есть загружать (git fetch) в любом случае придётся всё объекты (изменения/коммиты). Другое дело — как применять эти изменения. Но раз они уже загружены, то почему бы их не применить полностью?

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от KennyMinigun

Тогда, наверное, будет лучше, если коллеги будут целиком загружать мой репозиторий с помощью git pull. В другой директории у них будут храниться уже файлы, измененные ими для себя. И из первого репозитория во второй будут копироваться только необходимые обновленные файлы с помощью какого-нибудь скрипта, правильно? Т.е. эта проблема не решается с помощью git'a.

Deleted
()

перед пуллом можно делать стэш, после пулла анстэш

proofit404 ★
()

заводим отдельный бранч со своими изменениями

сразу после пулла нужно нужно ребейзнуть этот бранч на мастер.

перед пушем и пуллом нужно из основного локального бранча убивать все коммиты из «бранча с изменениями»

руками - через interactive rebase

или можно написать скрипт. Суть такова: все коммиты из «бранча с изменениями» помечаются. Например, через git notes. Или commit messages начинаются с определенной строки типа REMOVE_ME. Дальше скрипт бежит по основному локальному бранчу и черрипикает все коммиты, которые не имеют такой метки.

а вообще, специально для этого есть stash-unstash

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от Deleted

Хм, и правда. Мне почему-то казалось, что оно в обе стороны работало, не помню такой ошибки.

xaizek ★★★★★
()
Ответ на: комментарий от stevejobs

перед пушем и пуллом нужно из основного локального бранча убивать все коммиты из «бранча с изменениями»...

Сильно всё переусложняешь. В таком подходе просто нужен git pull в мастер и git rebase master из бранча со своими изменениями. Не нужно городить никакое адище со скриптами. И ТСу нужно переностить файлы целиком, rebase этого делать не будет.

mashina ★★★★★
()
Ответ на: комментарий от mashina

год юзал git-svn, таких скриптов наплодил афигительное количество. Работает, но очень легко ошибиться в скрипте и похерить чужую работу. Или еще хуже - посреди скрипта ошибка, и огромный репозиторий снова git-svn'ить два часа (эти два часа тебя будут непрерывно бить ногами за закоммиченый косяк). В общем ты прав.

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от kike

Дешевый понт: для vcs важна возможность работы под большим числом возможных архитектур. И предсказуемость на больших проектах.

Кстати, lazy-get относится и к отдельным файлам? (а то казалось, что просто избегание отдельных ревизий и веток из истории)

anonymous
()
Ответ на: комментарий от anonymous

для vcs важна возможность работы под большим числом возможных архитектур

Ну да, darcs на atmega8 не работает. А git?

И вообще. Я всегда думал, что важно удобство инструмента в первую очередь.

kike
()
Ответ на: комментарий от kike

Ну да, darcs на atmega8 не работает. А git?

Не может нормально ответить - промолчи.

И вообще. Я всегда думал, что важно удобство инструмента в первую очередь.

Илита головного мозга? В чем-то удобнее, в чем-то нет.. второе: для git/hg (в меньшей степени) существуют удобные «платформы» (darcsweb и patch-tag, если не ошибаюсь, - не дотягивают). Да и коммьюнити хаскеля, почему-то почему-то больше склонно к git: по hackage прослеживается.

anonymous
()
Ответ на: комментарий от stevejobs

Не понимаю, как тут помогут «stash-unstash», он разве при apply (pop) не смержит вместо перезатирания?

anonymous
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.