2012-03-06 4 views
159

Tôi có một kho lưu trữ trống CENTRAL có ba kho lưu trữ dành cho nhà phát triển kéo và đẩy nó vào bình thường.Làm cách nào để buộc git pull ghi đè mọi thứ trên mỗi lần kéo?

Tôi cũng có hai kho lưu trữ khác lấy từ repo trần CENTRAL: một là máy chủ trực tiếp và máy còn lại là máy chủ thử nghiệm/giai đoạn — mỗi máy kéo từ chi nhánh tương ứng.

Kịch bản này là: Tôi có một tập lệnh móc post-update trên repo CENTRAL tự động truy cập vào bản kiểm tra và bản trình diễn trực tiếp và chạy lệnh kéo trên mỗi. Điều này cập nhật cả máy chủ thử nghiệm và máy chủ trực tiếp, tất cả tùy thuộc vào nhánh nào có cam kết mới. Điều này tất cả các công trình lớn.

Vấn đề là: có thể có lần trong trường hợp khẩn cấp các tệp có thể được cập nhật trực tiếp trên máy chủ (thông qua ftp hoặc bất kỳ điều gì) và tập lệnh sau khi cập nhật CENTRAL sẽ không thành công kể từ khi hợp nhất/ghi đè xung đột sẽ xảy ra. Không có cách nào để tránh tình huống này, và điều đó là không thể tránh khỏi.

Điều tôi muốn xảy ra là: Tôi muốn kéo từ các trang web trực tuyến và thử nghiệm đến luôn ghi đè/hợp nhất khi kéo. Luôn. Các repos này sẽ được kéo chỉ vì chúng không phải để phát triển.

Trong tất cả các nghiên cứu của mình, tôi không thể tìm được giải pháp tốt để có thể kéo luôn bắt buộc ghi đè lên các tệp cục bộ. Đây có phải là ở tất cả có thể? Nó sẽ làm cho một kịch bản phát triển tuyệt vời nếu như vậy.

+1

Trong khi tôi đã bỏ phiếu cho 'thiết lập lại những gì bạn vừa lấy' trả lời dưới đây, tôi nghĩ rằng giải pháp cho vấn đề thực sự của bạn là không thực hiện thay đổi ngoài băng. Sửa đổi, bất kể mức độ khẩn cấp, nên * luôn luôn * đi qua kiểm soát phiên bản. Không ai ngoại trừ nhà điều hành nên có quyền truy cập trực tiếp vào các trang web đang hoạt động (ví dụ: không phải nhà phát triển). Sử dụng kiểm soát phiên bản nhất quán có nghĩa là bạn có hồ sơ về thời điểm các thay đổi được thực hiện và ai đã thực hiện chúng cũng như các công cụ tốt hơn để làm việc với chúng. Tại sao phá hoại nó, không có lợi ích thực sự? – Novelocrat

+1

@Novelocrat đúng, tôi hiểu những gì bạn đang nói. Thật không may, có một số tình huống mà ai đó có thể tải lên một tập tin trực tiếp đến máy chủ. Trong trường hợp đó tôi sẽ cần phải chạy một số lệnh để tái đồng bộ hóa các repos. Trước đây chúng tôi sử dụng một kịch bản FTP để di chuyển các tập tin từ repo đến máy chủ. Phương pháp được đề xuất ở trên sẽ đơn giản loại bỏ bước FTP, bước này đã hoạt động rất tốt trong quá khứ. – bmilesp

+3

Vì vậy, đừng để mọi người truy cập trực tiếp vào máy chủ. Khóa truy cập FTP và SSH hoặc thông báo cho họ rằng họ sẽ bị sa thải vì thực hiện các thay đổi không thể thực hiện được. Để thực hành kiểu đó tiếp tục chỉ làm tổn thương bạn và nhóm của bạn trong thời gian dài. – Novelocrat

Trả lời

411

Thực sự là cách lý tưởng để làm điều này là không sử dụng pull ở tất cả, mà thay vào đó fetchreset:

git fetch origin master 
git reset --hard FETCH_HEAD 
git clean -df 

(Thay đổi master để bất cứ điều gì chi nhánh bạn muốn được tiếp theo.)

pull được thiết kế xung quanh việc hợp nhất các thay đổi với nhau theo một cách nào đó, trong khi reset được thiết kế chỉ đơn giản là làm cho bản sao cục bộ của bạn khớp với một cam kết cụ thể.

Bạn có thể muốn xem xét các tùy chọn hơi khác với clean tùy thuộc vào nhu cầu của hệ thống của bạn.

+4

wow, điều này thật tuyệt vời. Làm thế nào nó hoạt động? – user730569

+3

@ user730569 'reset --hard' là một lệnh được sử dụng để buộc các trạng thái của thư mục làm việc (và các chi nhánh hiện hành) để phù hợp với tình trạng của một đặc biệt cam kết. – Amber

+0

@Amber right, tôi đã sử dụng 'reset --hard' trước đây, nhưng không bao giờ kết hợp với' fetch'. Khi bạn gọi hàm tìm nạp, nó có hợp nhất nội dung thành chính hay vào 'FETCH_HEAD'. 'FETCH_HEAD' là gì và nó liên quan đến chủ nhân ở đâu? Cuối cùng 'clean -df' là gì? – user730569

2

Bạn có thể thay đổi móc để lau sạch mọi thứ.

# Danger! Wipes local data! 

# Remove all local changes to tracked files 
git reset --hard HEAD 

# Remove all untracked files and directories 
git clean -dfx 

git pull ... 
+1

x làm gì? xin giải thích các công tắc – nottinhill

+1

@SirBenBenji: Đọc man page: http://git-scm.com/docs/git-clean –

+0

x được cho là để loại bỏ tất cả các file untracked, tôi nghĩ. Khó nói trong manpage-nói, đó là lý do tại sao chúng tôi có SO. – JosephK

5

Tôi không chắc chắn làm thế nào để làm điều đó trong một lệnh nhưng bạn có thể làm điều gì đó như:

git reset --hard 
git pull 

hoặc thậm chí

git stash 
git pull 
2

Để kéo một bản sao của chi nhánh và lực đè lên các tập tin địa phương từ việc sử dụng nguồn gốc:

git reset --hard origin/current_branch 

Tất cả công việc hiện tại sẽ bị mất và sau đó nó sẽ được giống như các chi nhánh gốc

1

Nếu bạn chưa cam kết những thay đổi cục bộ chưa kể từ khi kéo cuối cùng/clone, bạn có thể sử dụng:

git checkout * 
git pull 

checkout sẽ xóa những thay đổi cục bộ của bạn với người cuối cùng địa phương cam kết, và pull sẽ sincronize nó vào kho lưu trữ từ xa

3
git reset --hard HEAD 
git fetch --all 
git reset --hard origin/your_branch