Как git отслеживает изменения, почему он запутывается? Потому что я делаю

У меня есть git-репозиторий в папке Dropbox, общий для Linux-машины и Windows-машины. Я пытаюсь синхронизироваться только на компьютере с Windows, потому что я знаю о "проблемах", которые могут возникнуть. Иногда я делаю небольшой коммит на Linux, чтобы отследить свои изменения,

Но теперь мне действительно интересно, что делает git: Id не трогал файл fonttest.tex, но Git сообщает мне, что он был изменен:

towi@havaloc:~/Dropbox/latex$ git status fonttest.tex
# On branch master
...
#   modified:   fonttest.tex

И diff выводит список всего файла: все строки удалены и вставлены снова. Хорошо, вероятно, CRLF-проблема. Вот я и спрашиваю todos а также fromdos конвертировать туда и обратно с и без CR и CRLF. Но - вы уже догадались - без изменений git: Все строки изменены.

Хм, подумал я, поскольку я знаю, что ничего не изменилось, я получаю чистую копию:

mv fonttest.tex fonttest.tex1
git checkout fonttest.tex

И потому что я любопытный человек, хочу увидеть разницу

diff fonttest.tex fonttest.tex1

ничего такого. В самом деле?

towi@havaloc:~/Dropbox/latex$ md5sum fonttest.tex*
d3544bd060504ebb682b2e446375b3b3  fonttest.tex
d3544bd060504ebb682b2e446375b3b3  fonttest.tex1

В самом деле. И что думает об этом?

towi@havaloc:~/Dropbox/latex$ git status fonttest.tex
# On branch master
...
#   modified:   fonttest.tex

Чувак, ты только что проверил это для меня! В чем тут дело? Почему git думает, что файл изменился?

Вот выдержка из моего конфига. Я внес некоторые коррективы в CRLF, следуя чьему-то совету по обмену Dropbox. Но... я просто не могу следовать за мерзавцем здесь.

towi@havaloc:~/Dropbox/latex$ git config -l       
diff.renames=copies
apply.ignorewhitespace=change
apply.whitespace=nowarn
core.whitespace=cr-at-eol
core.repositoryformatversion=0
core.filemode=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
core.eol=lf
core.autocrlf=input

2 ответа

Решение

Хотя хранилище Git, вероятно, можно хранить в папке Dropbox, проблема заключается в том, что несколько систем будут совместно использовать рабочий каталог и индекс, если вы будете их там хранить. Git не был специально разработан для такого использования.

Я думаю, что проблема, с которой вы сталкиваетесь, как-то связана с этим. Возможно, это проблема конца строки, так как ваш компьютер с Windows будет использовать \r\n но ваша машина Linux будет использовать \n,

Если вы хотите использовать Dropbox для синхронизации репозиториев Git, я бы порекомендовал оставить пустой репозиторий в Dropbox, а затем извлекать его из отдельных репозиториев и выдвигать к нему. Таким образом, пустой репозиторий будет синхронизироваться через Dropbox, но каждая операционная система будет хранить свои собственные рабочие каталоги и индексы отдельно.

Вы бы сделали это на вашем Linux-компьютере:

mv ~/Dropbox/latex ~/
cd ~/latex
git init --bare ~/Dropbox/latex.git
git remote add dropbox ~/Dropbox/latex.git
git push dropbox master

Затем на вашем компьютере с Windows сделайте это:

cd %USERPROFILE%
git clone Dropbox\latex.git
cd latex
git remote rename origin dropbox

С этого момента, вы будете делать всю свою работу внутри ~/latex (Linux) и %USERPROFILE%\latex (Windows). Когда вы делаете коммиты, которыми хотите поделиться, вы бы использовали git push dropbox master в одном репо и git pull dropbox master в другом.

Вы извлекаете потенциально важную информацию из вывода состояния git. Говорит ли Git-статус "Изменения, не подготовленные для фиксации" или "Изменения, подлежащие подтверждению". Если в нем указано последнее, причина, по которой файл всегда отображается как измененный, заключается в том, что в индексе есть несвязанные изменения.

Другие вопросы по тегам