使用unison同步包含git存储库的目录

时间:2015-07-25 16:57:58

标签: git unison

我想在两台机器上同步包含我的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动作。

2 个答案:

答案 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 #13blog post中展示。