2015-07-25 19 views
5

Tôi muốn đồng bộ hóa một thư mục chứa repo git của các dấu chấm của tôi trên hai máy. Cả hai máy sẽ thay đổi các tập tin trong repo. Thông thường, tôi sử dụng unison để đồng bộ hóa các thư mục nhưng trong trường hợp này các tệp trong thư mục .git phân kỳ ngay cả khi nội dung thư mục có vẻ bề ngoài giống nhau. Unison ném tay lên và bỏ đi khi thấy nó.Thư mục đồng bộ chứa kho git với 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 

Một byte-by-byte đồng bộ ở đây không hoạt động bởi vì ngay cả với các tập tin tương tự và tiểu bang git git các tập tin nội bộ có thể khác nhau. Làm thế nào tôi có thể đồng bộ các thư mục này? Sau khi đồng bộ, tất cả các tệp không phải git và trạng thái git phải giống hệt nhau trên hai máy. Theo trạng thái git, tôi có nghĩa là cam kết lịch sử và dàn dựng nhưng không nhất thiết phải mỗi byte của mọi tệp git nội bộ (ví dụ: .gitignore, .git). Tôi không biết đủ về git để đi vào chi tiết hơn về những gì tôi có ý nghĩa bởi điều đó, nhưng nếu đó là không rõ ràng chỉ bình luận.

Tôi không muốn thực hiện bất kỳ cam kết git nào trong quá trình đồng bộ hóa. Tôi thấy điều khiển phiên bản và đồng bộ hóa dưới dạng hai vấn đề riêng biệt ở đây.

Đặt các từ git và đồng bộ hóa vào google cho kết quả mô tả cách sao chép một repo. Chỉ cần rõ ràng, không có cách nào trong việc sử dụng "đồng bộ hóa" ở trên đang đề cập đến các hành động git.

Trả lời

2

Đồng bộ byte từng byte ở đây không hoạt động vì ngay cả với cùng một tệp và git, các tệp git nội bộ có thể khác nhau.

Đó là lý do tại sao bạn không đồng bộ hóa một thư mục .git (other have tried with dropbox, the result was not satisfactory)

Tôi muốn giới thiệu using git bundle, nhưng quá trình này có thể là một chút phức tạp.

Có các công cụ khác để quản lý và đồng bộ hóa dotfiles. Một cái rất tốt là RichiH/vcsh, được trình bày trong GitMinutes #13 và trong số này blog post.

+0

Bạn có nói rằng toàn bộ nội dung không phải là không thể đồng bộ hóa trực tiếp? – Praxeolitic

+0

@Praxeolitic không phải với git repo anyway. Git không có nghĩa là không được đồng bộ hóa trực tiếp, nhưng đã được sử dụng để quản lý các dấu chấm. – VonC

+1

Tôi nên làm rõ điều này ban đầu nhưng là đồng bộ hóa trực tiếp một repo git và tất cả các trạng thái git trên máy vốn không thể như bây giờ?Bằng cách đó, tôi có nghĩa là làm một cái gì đó về git làm cho rằng nhiệm vụ chính nó không nhạy cảm hoặc làm các giải pháp thỏa đáng chỉ không tồn tại? Cảm ơn. – Praxeolitic

4

Dựa trên lời khuyên của VonC, tôi sẽ thư giãn yêu cầu đồng bộ hóa trực tiếp toàn bộ trạng thái git và chỉ cần bỏ qua thư mục .git với unison và chỉ sử dụng git fetch.

phần có liên quan của .unison/dotfiles.prf tôi:

root = /home/khouli/dotfiles 
root = ssh://other_machine//home/khouli/dotfiles 
ignore = BelowPath .git 

phần có liên quan của kịch bản đồng bộ của tôi:

unison dotfiles 
(cd $HOME/dotfiles && git fetch) 
ssh other_machine 'cd dotfiles && git fetch' 

này đồng bộ hóa các tập tin bản thân và cam kết lịch sử. Nó không đồng bộ dàn dựng nhưng đó không phải là quá quan trọng và nó có thể thậm chí không được mong muốn. Điều này cũng yêu cầu cả hai máy có kết nối mạng thích hợp cho một số git fetch. Nếu không, git bundle như VonC gợi ý có thể được sử dụng.

Đây chỉ là ở đây bất kỳ ai đến đây từ google và thấy nó hữu ích. Tôi không đánh dấu nó là chấp nhận bởi vì nó sẽ là thú vị nếu một câu trả lời cho thấy một cách để sống đồng bộ hóa một repo git.

Các vấn đề liên quan