我在 Dropbox 文件夹中有一个 git 存储库,在 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
真的。Git 对此有何看法?
towi@havaloc:~/Dropbox/latex$ git status fonttest.tex
# On branch master
...
# modified: fonttest.tex
哥们,你刚刚帮我检查过了!这是怎么回事?为什么 git 认为文件已经更改了?
以下是我的配置摘录。我确实根据某人关于 Dropbox 共享的提示对 CRLF 做了一些调整。但是……我在这里无法遵循 git。
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
答案1
虽然将 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
在另一个存储库中使用。
答案2
您正在从 git status 输出中截取一些可能很重要的信息。git status 是否显示“未暂存更改以供提交”或“待提交更改”。如果显示后者,则文件始终显示为已修改的原因是因为您在索引中有未提交的更改。