2013-01-17 32 views
5

Đây là kịch bản. Tôi có hai máy, "máy tính để bàn" và "máy tính xách tay".Làm cách nào để giữ hai kho lưu trữ git đồng bộ?

Trên máy tôi làm:

mkdir git_test 
cd git_test 
git init 
dd if=/dev/urandom of=test.img bs=1k count=1000 
git add test.img 
git commit -m "Added first image" 

Sau đó, trên máy tính xách tay tôi làm:

git clone [USER]@desktop:/home/[USER]/git_test  
cd git_test 
dd if=/dev/urandom of=test2.img bs=1k count=1000 
git add test2.img 
git commit -m "Added second image" 

Sau đó, tôi muốn các repo git trên máy tính để bàn của tôi để trông giống như repo git trên máy tính xách tay của tôi. Trên máy tính xách tay, tôi phát hành như sau: git push nguồn gốc chủ

Nhưng sau đó tôi nhận được:

remote: error: refusing to update checked out branch: refs/heads/master 
remote: error: By default, updating the current branch in a non-bare repository 
remote: error: is denied, because it will make the index and work tree inconsistent 
remote: error: with what you pushed, and will require 'git reset --hard' to match 
remote: error: the work tree to HEAD. 
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to 
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into 
remote: error: its current branch; however, this is not recommended unless you 
remote: error: arranged to update its work tree to match what you pushed in some 
remote: error: other way. 
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set 
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'. 

Làm thế nào để giữ cho hai Repos những đồng bộ?

Các thông báo lỗi dường như ngụ ý rằng git có chức năng mà tôi mong muốn, nhưng vì một lý do nào đó, nó có vẻ là luồng công việc nâng cao hơn. Tôi nghe ai đó nói một lần rằng bạn không thể đẩy đến chi nhánh bạn đang ở trên, ai đó có thể giải thích về điều đó như một giải pháp có thể? Tôi sẽ không có vấn đề gì với một giải pháp tự nhiên, nghĩa là tôi có thể làm việc trên một nhánh nhất định trên máy tính xách tay của mình và một nhánh khác trên máy tính để bàn của tôi.

Xin lưu ý những điều sau đây!

  • Tôi không muốn sử dụng repo tập trung, như github, vì nhiều lý do. Đầu tiên là bảo mật. Thứ hai là sự đơn giản. Thứ ba là do hoàn cảnh tôi sẽ không đi vào đây, tôi không thể đếm khi có kết nối internet với một số máy chủ từ xa, tôi chỉ có hai máy được kết nối qua mạng LAN. Cuối cùng, tôi muốn học cách làm những điều theo cách tôi yêu cầu ở đây, để đạt được phần kiến ​​thức cụ thể đó.

  • Tôi cũng không muốn sử dụng một repo trần, như một repo trần có một bó của cruft trong thư mục gốc. Điều này là xấu xí và lộn xộn. Toàn bộ lý do tôi chuyển sang git từ subversion là git trông giống như một giải pháp sạch hơn, phân cấp. Ngoài ra, tôi có một số người hơi phi kỹ thuật sẽ hoạt động trong thư mục gốc của máy tính để bàn, họ sẽ nhận được khá bối rối bởi tàu tuần dương. Vẻ đẹp của git là (tôi nghĩ) rằng tất cả mọi thứ ẩn trong thư mục .git. Edit: Rõ ràng là tôi chưa đủ rõ ràng với điểm này. Hãy tưởng tượng tôi có một thư mục "Tài liệu" với các thư mục con sau: mydata1 và mydata2. Đây không phải là một ví dụ giả tạo, đây chính là vấn đề tôi đang cố giải quyết. mydata1 nên chứa "test.img" và duy nhất mà tập tin, nhưng thay vào đó nó hiện có:

    chi nhánh cấu hình mô tả ĐẦU móc thông tin đối tượng refs

tôi muốn để có thể chỉ cần cd vào mydata1 và bắt đầu chỉnh sửa các tập tin, nhưng thay vào đó tôi phải thử và cd thông qua các chi nhánh, hoặc bất cứ điều gì thậm chí chỉ để hoàn thành công việc. Và để có loại cấu trúc thư mục này cho mỗi thư mục con nằm trong "tài liệu" chỉ là không thể thực hiện được. Xin vui lòng, xin vui lòng không cho tôi biết để làm những việc theo cách này. Vui lòng chỉ trả lời câu hỏi. Cảm ơn.

Hai điểm này là toàn bộ lý do tôi đăng câu hỏi này tại đây.Vui lòng chỉ trả lời nếu bạn có câu trả lời cho câu hỏi này. :) Cảm ơn!!

+0

"cruft" tôi đề cập đến là: "branch config description HEAD hooks đối tượng thông tin refs" Tôi chỉ muốn/home/[User]/git_repo chỉ chứa các tệp tôi đang làm việc. Ngoài ra: thư mục .git bị ẩn. –

+0

Bạn có thể ẩn repo. – nobar

Trả lời

10

Một cách để thực hiện việc này là kéo, không đẩy. Sau khi bạn đã thiết lập hai máy, trên máy đầu tiên:

git remote add origin [USER]@laptop:/home/[USER]/git_test 
git pull # Complains about untracked branch while adding the branch you want to track 
git branch --set-upstream master origin/master 
git pull 

Bây giờ bạn có thể lấy cam kết từ một trong hai máy. Nếu bạn muốn đẩy, tôi không chắc chắn làm thế nào để đi về điều đó với một thiết lập phi tập trung.

+0

kéo hoàn toàn hoạt động cho công việc của tôi, miễn là tôi không phải đối phó với một repo trần hoặc repo tập trung. Cảm ơn bạn đã làm rõ điều này. Tôi sẽ kiểm tra quy trình làm việc này và báo cáo lại. Cảm ơn! –

+1

Một khả năng không được đẩy mạnh nếu các máy còn tách rời về mặt vật lý: tạo bí danh bash cho một cái gì đó như 'bí danh git_push =" ssh remotemachine 'cd git_test; git pull' "' – cjc343

+0

Đây chắc chắn là cách để đi. Hãy xem xét nếu hai repos thuộc về bạn và người khác; bạn sẽ không muốn người khác bán đồ đạc của mình vào kho lưu trữ của bạn và anh ta sẽ không muốn bạn bán phá giá của bạn cho anh ta. Khá một câu chuyện khác nhau để kéo công việc mới vào, có lẽ ở một nhánh khác, hơn là đẩy nó ra. –

2

Tôi có thể thiếu lý do tại sao bạn không muốn sử dụng repo trần, và tôi tin rằng giải pháp kéo chỉ nên hoạt động tốt, nhưng tôi cũng tin rằng "cruft" vẫn có thể được ẩn theo cách bạn mong muốn khi làm việc với một repo trần.

Mở máy tính để bàn của bạn, nếu bạn:

mkdir git_test 
git init --bare git_test 

Và sau đó:

git clone bare_repo_directory new_location 

Bạn có thể đẩy và kéo thường để repo trần (tham khảo nó như là nguồn gốc theo mặc định) từ các bản sao, và không ai phải đối phó với nội dung bổ sung mà nó chứa; các bản sao sẽ chỉ có thư mục .git.

Để đẩy bạn sẽ cần phải chạy:

git push origin master (assuming you're working out of master) 

Đối với máy tính xách tay của bạn:

git clone [USER]@desktop:path_to_bare 

Và công việc nên bình thường trong bản sao nhân bản. Bạn sẽ đẩy và kéo từ nguồn gốc (đó là repo trần), nhưng bạn không cần phải làm việc trực tiếp.

1

Lý do đẩy không hoạt động chính xác là những gì bạn đề cập. Theo mặc định, bạn không thể đẩy tới một brach nếu vùng lưu trữ đó (vùng nhận từ xa) hiện tại không gian làm việc trỏ đến cùng nhánh đó. Vì vậy, nếu từ xa của bạn có master hiện đã được kiểm tra, bạn sẽ không thể đẩy tới master.

Hai giải pháp nhanh chóng:

Nếu bạn đã có cam kết trong repo, chỉ cần kiểm một hash trực tiếp, mà sẽ đưa bạn vào tình trạng không đầu, điều đó có nghĩa rằng bạn không phải tại bất kỳ chi nhánh:

> git checkout <any-hash> 
Note: checking out '<any-hash>'. 

You are in 'detached HEAD' state... 

một cách khác với một thương hiệu repo mới, nếu bạn muốn push to master, chỉ là để thay đổi điều đó chi nhánh ban đầu để cái gì khác không có tên master:

> git symbolic-ref HEAD refs/heads/non-existent 

Điều này sẽ đưa bạn vào một trạng thái tương tự như với master trong một kho lưu trữ mới, trong một chi nhánh không có cam kết trên đó. Chỉ cần bạn sẽ không được nắm lấy chủ và do đó nó sẽ được phép nhận đẩy.

1

Gần đây, tôi đã gặp sự cố khi máy chủ và máy tính để bàn của tôi không đồng bộ hóa. Sau khi tìm kiếm trên web trong một thời gian, tôi đã không thể tìm thấy một câu trả lời mà xử lý với tình hình chính xác của tôi. Vì vậy, tôi gọi là hỗ trợ Rackspace và họ đã có thể cung cấp cho tôi những gì tôi nghĩ là một câu trả lời tốt hơn so với tôi đã có thể tìm thấy trực tuyến.

Chuỗi cụ thể này gần nhất với vấn đề của tôi nên tôi nghĩ tôi sẽ chia sẻ cách giải quyết vấn đề ở đây trong trường hợp có ai gặp vấn đề tương tự trong tương lai.

Đây là những gì đã xảy ra

Tôi đã cố gắng để cài đặt plugin Sweet Tooth cho Magento và sau đó cùng với các bước thông thường tất cả chúng ta đi qua cài đặt tiện ích Magento. Điều này có nghĩa là lấy một loạt các tập tin và đặt chúng trong thư mục App, JS và Skin của tôi.

Trong thư mục app/design/adminhtml có thư mục "base". Nếu bạn biết bất cứ điều gì về Magento thì bạn biết họ có một số cảnh báo về việc rối tung với các tệp cơ sở. Tóm lại - đừng làm thế.

Tôi giả định rằng vì repo địa phương của tôi không có thư mục "cơ bản", tôi sẽ không sao cho nó vào máy cục bộ của tôi. Thật không may và nhiều để mất tinh thần của tôi, điều này có nghĩa rằng khi tôi đã thêm của tôi nó được thêm vào một thư mục "cơ sở" chỉ với các tập tin cho Sweet Tooth. Khi tôi đặt nó lên máy chủ, nó đã xóa toàn bộ thư mục cơ sở của tôi và Boom! xuống Magento.

May mắn tôi đã có thể để có được trở lại tình trạng máy chủ trước đó bằng cách sử dụng lệnh cuộc sống tiết kiệm sau đây:

git reset --hard ĐẦU @ {1}

lệnh này có bạn quay trở lại cam kết trước đó và ngay lập tức mọi thứ đã trở lại bình thường. Tất nhiên bây giờ máy chủ và máy tính để bàn của tôi đã không đồng bộ kể từ khi máy chủ của tôi bây giờ là một cam kết phía sau.

Để thêm sự xúc phạm vào thương tích, tôi đã phạm sai lầm rất lớn và xóa các tệp cho tiện ích mở rộng khỏi máy tính của mình và thực hiện một cam kết khác trên máy tính để bàn của tôi, giờ đây máy chủ và máy tính để bàn không đồng bộ tệp trong bộ nhớ cache của nó.

Đây là cách tôi giải quyết nó

Rõ ràng này để lại cho bạn ở một nơi khá khó chịu bởi vì làm một pull git trên máy chủ của tôi sẽ lau-out "cơ sở" của tôi thư mục mỗi lần duy nhất. Ngoài ra vì nó là hai cam kết phía trước tôi không thể chỉ khôi phục một cam kết. Tôi gọi là Rackspace người ở thời điểm này là vị thần trong tâm trí của tôi và tìm thấy hai cách khác nhau để giải quyết điều này tùy thuộc vào việc bạn muốn làm điều này từ phía máy chủ hoặc phía máy tính để bàn.

Vì nó quay ra bạn thực sự không thể làm điều này từ phía máy chủ vì các tệp giờ không còn trên màn hình. Trong khi họ đề nghị thực hiện git commit -a và sau đó thực hiện một cú đẩy từ máy chủ, sau đó kéo từ máy tính để bàn, điều này sẽ không hoạt động, các tệp sẽ không còn trên màn hình nữa.

Vì vậy, bạn phải sửa chữa nó từ Máy tính để bàn và bạn cần phải lấy các tệp darn đó ra khỏi bộ nhớ cache.

Sửa Sync Issue từ desktop

Để có được các tập tin ra khỏi bộ nhớ cache I ban hành lệnh sau kết thúc, và kết thúc, và hơn nữa cho đến khi các tập tin mà tôi đã loại bỏ cũng đã được gỡ bỏ theo git .

git rm -r --cached/thư mục/thư mục cho các thư mục

git rm --cached/thư mục/tập tin cho các tập tin

Bây giờ rằng điều này đã được ra khỏi bộ nhớ cache tôi đã có thể làm một cam kết và cuối cùng cho git biết những tập tin này đã thực sự biến mất.

Điều này đã được theo sau bởi một lần nhấn cho bậc thầy. Sau đó, tất cả những gì còn lại để làm là một kéo từ máy chủ và viola, trở lại trong kinh doanh!

** Kết luận và bài học kinh nghiệm **

Các bài học kinh nghiệm ở đây là một số những người lớn và tôi đang viết bài này cho các lập trình viên khác có một vấn đề tương tự cũng như bản thân mình để nhắc nhở tôi về những gì không làm lại bao giờ.

  1. Nếu bạn không có một thư mục trong repo địa phương của bạn đó là trên các máy chủ, không thêm nó vào repo địa phương của bạn chỉ với một vài tập tin trong nó, điều này sẽ zero-out thư mục trên máy chủ.

  2. Nếu bạn vô tình vít mọi thứ lên, hãy chắc chắn để loại bỏ các tập tin với git, đừng xóa chúng khỏi hệ thống tập tin địa phương của bạn

  3. git nghỉ ngơi --hard ĐẦU @ {1} có thể là tốt nhất của bạn bạn bè đôi khi

Tôi hy vọng điều này sẽ giúp bất kỳ ai khác trong tình huống tương tự. Tôi dành hàng giờ rót tài liệu trực tuyến nhưng không tìm được thứ gì phức tạp mà tôi gặp phải ở đây nên nếu tôi có thể giúp người khác tiết kiệm thời gian và kiếm ít lông xám hơn thì cơn ác mộng của tôi sẽ phục vụ tốt cho thế giới !

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