我想在两台机器上同步一个包含我的dotfiles的git repo的目录.两台机器都将对repo中的文件进行更改.通常我使用unison来同步目录,但在这种情况下,.git即使目录内容表面上相同,目录中的文件也会发散.当它看到这一点时,Unison会举手并退出.
$ unison dotfiles
changed <-?-> changed .git/FETCH_HEAD
changed <-?-> changed .git/ORIG_HEAD
changed <-?-> changed .git/index
changed <-?-> changed .git/logs/HEAD
changed <-?-> changed .git/logs/refs/heads/master
changed <-?-> changed .git/logs/refs/remotes/origin/master
Run Code Online (Sandbox Code Playgroud)
这里的逐字节同步不起作用,因为即使使用相同的文件和git状态,内部git文件也可能不同.我该如何同步这些目录?同步后,两台计算机上的所有非git文件和git状态应该相同.通过git状态我的意思是提交历史记录和暂存,但不一定是每个内部git文件的每个字节(例如.gitignore,.git).我不太了解git,我会详细了解我的意思,但如果不清楚只是评论.
我不想将任何git提交作为同步的一部分.我认为版本控制和同步是两个独立的问题.
将git和sync这些单词放入google会产生描述如何克隆repo的结果.需要明确的是,上面"同步"的使用都不是指git动作.
根据VonC的建议,我将放宽实时同步整个git状态的要求,并简单地忽略该.git目录,只需使用即可git fetch.
我的相关部分.unison/dotfiles.prf:
root = /home/khouli/dotfiles
root = ssh://other_machine//home/khouli/dotfiles
ignore = BelowPath .git
Run Code Online (Sandbox Code Playgroud)
我的同步脚本的相关部分:
unison dotfiles
(cd $HOME/dotfiles && git fetch)
ssh other_machine 'cd dotfiles && git fetch'
Run Code Online (Sandbox Code Playgroud)
这会同步文件本身和提交历史记录.它不会同步暂存,但这不是太重要,甚至可能都不可取.这也要求两台机器都具有适当的网络连接git fetch.否则git bundle像VonC建议可以使用.
这只是在这里,任何人从谷歌来到这里,发现它很有用.我没有把它标记为被接受,因为如果一个答案出现了一种生活同步git repo的方式会很有趣.
此处的逐字节同步不起作用,因为即使使用相同的文件和 git 状态,内部 git 文件也可能不同。
这就是为什么你不同步 .git 文件夹(其他人尝试过使用 dropbox,结果并不令人满意)
我建议使用git bundle,但该过程可能有点复杂。
还有其他用于管理和同步点文件的工具。其中一个非常好的内容是在GitMinutes #13和这篇博文RichiH/vcsh中介绍的。