Git уничтожает файл во время проверки [duplicate]

26
задан Sheena 23 October 2014 в 14:52
поделиться

4 ответа

Это нормально, хотя я немного удивлен одним из шагов.

Когда вы переключаетесь с B на A, git видит, что файл должен быть обновлен в соответствии с версией A и делает это тихо, потому что вы проигнорировали его, сказав, что в отношении ветви B файл не имеет значения. Он должен сделать это - единственная альтернатива - отказаться от проверки ветки A. (Он отказался бы, если бы файл не был проигнорирован, сказав, что «Untracked working tree file» будет перезаписан слиянием ». Я действительно удивлен это не делает этого в этом случае тоже. У любого есть представление о том, является ли это свойство или ошибка?)

Когда вы переключаетесь обратно, git видит, что ветвь B не имеет этого файла, и удаляет его. Опять же, это нужно сделать. У него нет возможности прочитать ваш разум и понять, что этот проигнорированный файл, который был там минуту назад, - это тот, который вы хотите вернуть - он просто дает вам содержимое ветки B, в которой указано, что файл не существует.

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

2
ответ дан Cascabel 25 August 2018 в 23:51
поделиться

Поскольку единственное жизнеспособное решение - всегда отслеживать файл «f», вы можете добавить только в ветви B, smudge / clean process с gitattributes filter driver :

https://raw.github.com/adisp007/ProGit/master/figures/18333fig0702-tn.png [/g3]

При проверке ветки B:

  • процесс размытия change: сохранить содержимое f во временном файле, заменив содержимое f на один файл fbis (отслеживаемый файл, который будет содержать для ветки B, «B содержимое f ")
  • чистый процесс: сохранить f содержимое (как изменено в B) в fbis (fbis совершается с f изменениями в ветви B) восстановить f (с временным файлом), то есть f не выполняется (игнорируется в B)

Вы можете добавить, все еще в ветви B, пользовательский драйвер слияния , который будет защищать fbis в случае слияния из других ветвей с B: драйвер слияния всегда будет сохранять B версию fbis контента, следя за тем, чтобы проигнорированный файл f вернуть свое содержание, когда всегда отделяется B.

Поскольку эти драйверы (фильтр и слияние) не выполняются в других ветвях, файл «f» фиксируется в других ветвях со всеми его модификациями. В ветке B его содержимое никогда не изменится, и все же «локальные модификации», сделанные в f, будут восстановлены всякий раз, когда B выгружается.

Если это восстановление содержимого не требуется, вам не нужно управлять fbis. Просто сохраните драйвер фильтра, и вы будете уверены, что независимо от того, какую модификацию вы делаете с f в ветви B, эти изменения никогда не будут совершены, эффективно игнорируя содержимое f.

5
ответ дан Community 25 August 2018 в 23:51
поделиться

Игнорирование файлов в git не означает, что они не проверяются. Вы можете проверить файл и управлять им в git и игнорировать его в .gitignore.

1
ответ дан dpc.pw 25 August 2018 в 23:51
поделиться

У меня возникла аналогичная ситуация, и я делаю это:

Я выберу файл, который был удален в checkout index.php.

В вашем .gitignore ветви A и ветвь B удаляют строку, которая игнорирует ваш index.php, после этого фиксируйте свой .gitignore в обеих ветвях.

В ветви A создайте резервную копию index.php, удалите это и зафиксируйте.

Восстановить в ветке A index.php из созданной ранее резервной копии и в вашем .gitignore снова игнорировать index.php и зафиксировать это.

В вашей ветке B добавить index.php, игнорировать файл в вашем .gitignore, зафиксировать и быть счастливым.

0
ответ дан Matt K 25 August 2018 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: