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

1378
towi

У меня есть 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 
4

2 ответа на вопрос

1
Stephen Jennings

Хотя хранилище 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в другом.

Отличная идея. Я не думал об этом. Таким образом, я мог также обрабатывать требуемые разные пути в обеих ОС. towi 11 лет назад 0
0
Ciclamino

Вы извлекаете потенциально важную информацию из вывода состояния git. Состояние git говорит: «Изменения не подготовлены для фиксации» или «Изменения должны быть зафиксированы». Если в нем указано последнее, причина, по которой файл всегда отображается как измененный, заключается в том, что у вас есть несвязанные изменения в индексе.

* не организовано *. Я могу `git добавить` файл, и он выглядит как * staged for commit * towi 12 лет назад 0