Ngăn chặn các cam kết trong nhánh chính


83

(Để đơn giản) Tôi có một masternhánh và một devtrong Git-repo của mình. Tôi muốn đảm bảo masterchi nhánh luôn hoạt động, vì vậy tất cả công việc tôi làm nên ở devchi nhánh.

Tuy nhiên, khi tôi hợp nhất các thay đổi của mình với một --no-ffhợp nhất, tôi có xu hướng ở lại masterchi nhánh và chỉ tiếp tục làm việc trong đó (vì tôi quên kiểm tra devchi nhánh của mình ).

Tôi có thể thiết lập một quy tắc cho masterchi nhánh, trong đó nói rằng tôi không thể thực hiện cam kết và hợp nhất tua đi, nhưng chỉ --no-ffhợp nhất từ ​​một chi nhánh khác?

Điều này phải hoạt động đối với các kho lưu trữ được lưu trữ riêng (không phải GitHub và BitBucket).


4
"cam kết chuyển tiếp nhanh" không phải là một điều. Cam kết chỉ là cam kết, git committạo ra một cái mới, không có chuyển tiếp nhanh xảy ra. Có vẻ như bạn chỉ muốn cấm các commit thông thường khi nhánh hiện tại master, trong trường hợp đó, hãy nhìn vào pre-commithook.

Câu trả lời:


154

Có, nó là có thể. Bạn phải tạo hook cam kết trước từ chối các cam kết đối với nhánh chính. Git không gọi hook commit trước khi bạn gọi lệnh merge , vì vậy hook này sẽ chỉ từ chối các commit thông thường.

  1. Chuyển đến kho lưu trữ của bạn.
  2. Tạo tệp .git / hooks / pre-commit với nội dung sau:

    #!/bin/sh
    
    branch="$(git rev-parse --abbrev-ref HEAD)"
    
    if [ "$branch" = "master" ]; then
      echo "You can't commit directly to master branch"
      exit 1
    fi
    
  3. Làm cho nó có thể thực thi (không bắt buộc trên Windows ):

    $ chmod +x .git/hooks/pre-commit
    

Để tắt hợp nhất tua đi nhanh, bạn cũng phải thêm tùy chọn sau vào tệp .git / config của mình :

[branch "master"]
    mergeoptions = --no-ff

Nếu bạn cũng muốn bảo vệ nhánh chính trên điều khiển từ xa của mình, hãy chọn câu trả lời sau: Cách hạn chế quyền truy cập vào nhánh chính trên git


Điều này trông chính xác như những gì tôi cần - điều này cũng hoạt động trong Windows?
Rasmus Bækgaard

2
@ RasmusBækgaard có nó sẽ như vậy: tập lệnh bash cho hook sẽ được diễn giải bởi Git bash có trong Git cho Windows. (Bạn chỉ không cần bước chmod)
VonC

lưu ý: bạn cũng có thể ngăn mình đẩy đến một masternhánh ở xa trong móc đẩy trước. ví dụ: gist.github.com/aaronhoffman/ffbfd36928f9336be2436cffe39feaec
Aaron Hoffman

4
Tuyệt vời, đối với bất kỳ ai đang tìm cách thêm các quy tắc này hoặc các git hook khác vào kho dự án, hãy kiểm tra gói npm đơn giản này: github.com/kilianc/shared-git-hooks , bởi vì bạn không thể bao gồm bất kỳ thứ gì nằm trong .git thư mục vào kho lưu trữ.
George Dimitriadis

9
Ngoài ra, điều này chỉ dành cho kho git cục bộ của chúng tôi, làm thế nào chúng tôi có thể thực thi các quy tắc trên các kho lưu trữ git khác nhau cho tất cả các nhà phát triển mà không yêu cầu họ thay đổi nội dung của thư mục .git theo cách thủ công?
Alexander Mills

12

Bạn có thể sử dụng tiện ích cam kết trước để thực hiện việc này. Nó có một no-commit-to-branchhook tích hợp có thể được sử dụng để ngăn chặn các commit tới một hoặc nhiều nhánh.

Thiết lập

Quá trình thiết lập cơ bản là:

  • Cài đặt bằng pip hoặc brew (hướng dẫn tại https://pre-commit.com/#install )
  • Tạo một .pre-commit-config.yamltệp trong thư mục gốc của dự án của bạn (xem bên dưới để biết bản nháp đầu tiên)
  • Cài đặt hook vào cấu hình git của bạn bằng cách chạy pre-commit install.

Cấu hình cơ bản để bảo vệ các nhánh

Đây là một cấu hình cơ bản chỉ bao gồm no-commit-to-branchhook:

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v3.3.0
  hooks:
    - id: no-commit-to-branch
      args: ['--branch', 'master']

Nếu bạn muốn bảo vệ nhiều nhánh, bạn có thể sử dụng bao gồm nhiều --branchargs trong danh sách đối số:

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v3.3.0
  hooks:
    - id: no-commit-to-branch
      args: ['--branch', 'master', '--branch', 'staging']

Đây không phải là tất cả quá mức cần thiết?

Pre-commit có nhiều hook tích hợp khác và một bộ sưu tập lớn các hook do cộng đồng xây dựng sẽ biến đổi cách bạn dọn dẹp và xác thực các cam kết của mình. Lý do tôi đề cập đến điều này là vì, mặc dù công cụ này có thể quá mức cần thiết để chỉ ngăn chặn các cam kết đối với một nhánh được bảo vệ, nhưng nó có nhiều tính năng khác làm cho nó trở thành một bổ sung hấp dẫn và đơn giản cho bất kỳ dự án git nào.


6

Có thể hợp lý khi cài đặt nó trên toàn cầu thông qua

git config --global core.hooksPath ~/githooks

và di chuyển pre-committệp đó vào thư mục đó


Điều gì sẽ xảy ra nếu tôi có nhiều kho lưu trữ - nó sẽ không ảnh hưởng đến tất cả chúng?
Rasmus Bækgaard

1
và đó là những gì bạn có thể làm gì trong hầu hết các trường hợp
Michel Samia

Nói rằng tôi có dự án kỳ lạ này, nơi họ đổi tên masterđể Production- trường hợp ngoại lệ có thể được thực hiện?
Rasmus Bækgaard

bạn có thể sử dụng hoặc nhà điều hành trong bash để xác định thêm chi nhánh bạn muốn bảo vệ về phía khách hàng
Michel Samia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.