我想在两台机器上同步包含我的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
这里的逐字节同步不起作用,因为即使使用相同的文件和git状态,内部git文件也可能不同。我该如何同步这些目录?同步后,两台计算机上的所有非git文件和git状态应该相同。通过git状态,我的意思是提交历史记录和暂存,但不一定是每个内部git文件的每个字节(例如.gitignore,.git)。我对git的了解还不够详细,我会详细说明我的意思,但如果不清楚只是评论。
我不想将任何git提交作为同步的一部分。我认为版本控制和同步是两个独立的问题。
将单词git和sync放入google会给出描述如何克隆repo的结果。需要明确的是,上面“同步”的使用都不是指git动作。
答案 0 :(得分:6)
根据VonC的建议,我将放宽实时同步整个git状态的要求,只需忽略.git
目录,只需使用git fetch
。
我.unison/dotfiles.prf
的相关部分:
root = /home/khouli/dotfiles
root = ssh://other_machine//home/khouli/dotfiles
ignore = BelowPath .git
我的同步脚本的相关部分:
unison dotfiles
(cd $HOME/dotfiles && git fetch)
ssh other_machine 'cd dotfiles && git fetch'
这会同步文件本身和提交历史记录。它不会同步暂存,但这不是太重要,甚至可能都不可取。这还要求两台计算机都具有git fetch
的适当网络连接。否则可以使用像VonC建议的git bundle
。
这只是在这里,任何人都可以从谷歌来到这里并发现它很有用。我没有把它标记为被接受,因为如果一个答案出现了一种生活同步git repo的方式,它会很有趣。
答案 1 :(得分:2)
这里的逐字节同步不起作用,因为即使使用相同的文件和git状态,内部git文件也可能不同。
这就是为什么你不同步.git文件夹(other have tried with dropbox, the result was not satisfactory)
我会推荐using git bundle
,但这个过程可能有点复杂。
还有其他用于管理和同步dotfiles的工具。其中一个非常好的是RichiH/vcsh
,在GitMinutes #13和blog post中展示。