Отслеживать некоторые файлы в git, но только в одной локальной копии - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть изменяющаяся / разрабатываемая программа, которая генерирует некоторые результаты для бумаги, которую мне нужно хранить, когда они меняются вместе с изменениями программы.Эти результаты могут быть довольно большими, и я не хочу, чтобы их отправляли на удаленный компьютер по разным причинам (я не хочу вмешиваться в git lfs и файловый хостинг, не хочу заставлять соавторов загружать его на клон, это может привести к конфликтус локальными результатами соавторов, не хотят постоянно увеличивать размер истории и т. д.).Обратите внимание, что эти результаты 1. не являются детерминированными и 2. занимают много времени для генерации, поэтому дело не только в том, «не могли бы вы просто перезапустить код?»

Хотя я, очевидно, мог бы просто сделать

mkdir ../results/
cp -r results ../results/results-some-description

Отслеживание этих файлов с помощью git имеет некоторые преимущества, которые я бы хотел:

  • Он связывает результаты, которые я фиксирую, с конкретным окном кода, который их сгенерировал.Я мог бы отследить эту информацию вручную, вставив коммит, например, в README или другие метаданные, но его регистрация намного проще.
  • Это дает мне git log возможность легко просматривать состояниевещей было, когда я генерировал какую-то версию результатов.
  • Мне нужно хранить только одну видимую копию и не иметь огромной папки с дюжиной каталогов, которые мне нужно пролистать, чтобы найти то, чтонужное мне состояние (не говоря уже о перекрестных ссылках и т. д.).

Я рассмотрел несколько методов, но выбросил их по разным причинам:

1.Создайте чисто локальный репозиторий, добавьте удаленный при соответствующей фиксации в качестве подмодуля или поддерева какого-то вида

Каждый раз, когда я генерирую результаты, это выглядит как несколько слишком много шагов (хотя возможно набор сценариев с шагами), а такжебыть немного хрупким, если я забуду один.Я чувствую, что могу просто скопировать их в отдельные папки, если я собираюсь сделать это.

2.Сделайте локальную ветвь, которую я никогда не нажимаю, которая содержит файлы результатов;Объединить рабочую ветку в то время, когда я готов зафиксировать новые результаты

Я думал, что это было многообещающе, пока я действительно не подумал об этом, и это проще всего проиллюстрировать с помощью следующего набора команд:

> mkdir tmp && cd tmp
> git init
> touch foo
> git add foo
> git commit -m "Add foo"
> touch result
> git checkout -b results
> git add result
> git commit -m "Add results"
> git checkout foo
> echo "new stuff" >> results
> git checkout results
error: The following untracked working tree files would be overwritten by checkout:
        results
Please move or remove them before you switch branches.
Aborting

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


На самом деле, я чувствую, что хочу, это своего рода (Github-совместимый) хук, который в основном говорит "игнорировать этот каталогполностью поддерево, как будто его вообще не было в истории, а только при удаленном нажатии / удалении. "Честно говоря, это не имеет большого значения, если он выдвигает жуткие фантомные пустые коммиты, когда единственные файлы, к которым прикасались, были файлы в этом наборе, или взрывается комично, если соавтор фиксирует конфликтующие файлы.Хотя было бы идеально, если бы у меня была возможность помещать файлы в это дерево, если бы я действительно хотел (например, сделать снимок окна кода + результатов и тега для совместного использования в будущем).

Есть ли способ управлять чем-то вроде этого?

1 Ответ

0 голосов
/ 23 февраля 2019

Лучшее решение, которое я могу себе представить, похоже на решение вашей локальной ветки, но с небольшим изменением: каждый раз, когда вы хотите зафиксировать результаты, создайте ветку results.description или results.serial-number, в которой вы фиксируете свои результаты.Как вы описали, эти ветви никогда не будут отправлены на сервер.

Это решает конфликт с неотслеживаемым файлом: вы не извлекаете results.1 для создания results.2, поэтому Git не будет знать оэто или помечать любые конфликты.

#update and commit software 
run-experiment > results
git checkout -b results.1
git add results
git commit -m "results and maybe comments about it"
git checkout master
# update and commit software
run-experiment > results
git checkout -b results.2
git add results
git commit -m "results and maybe comments about it"
git checkout master

Чтобы перечислить все результаты в вашей песочнице:

git branch | grep results

Чтобы просмотреть некоторые старые результаты:

git checkout results.1

Чтобы просмотретьнекоторые старые результаты без проверки ответвления:

git show results.1:results

Итак, я заметил в вашем вопросе, что вы делаете echo "new stuff" >> results, предполагая, что вы хотите, чтобы файл результатов был накопительным.Мое решение не делает этого, но вот способ проверить все результаты, как если бы файл был накопительным:

for branch in `git branch | grep results`; do
   echo ======================== $branch
   git show $branch:results
done | less
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...