Как 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-статус "Изменения, не подготовленные для фиксации" или "Изменения, подлежащие подтверждению". Если в нем указано последнее, причина, по которой файл всегда отображается как измененный, заключается в том, что в индексе есть несвязанные изменения.