Tự động cắt tỉa với Git lấy hoặc kéo


248

Nếu ai đó đã xóa một chi nhánh từ xa vì công việc đã kết thúc và tôi không biết, tôi sẽ không làm git fetch --prunevà cuối cùng tôi sẽ đẩy lùi chi nhánh bị xóa.

Có giải pháp khả thi nào để buộc Git sử dụng chế độ cắt tỉa khi tìm nạp / kéo mà không phải chỉ định nó mỗi lần không?


1
Bạn sẽ sớm (git 1.8.5, Q4 2013) có thể chỉ định trong cấu hình cục bộ của một repo mà bạn muốn luôn luôn cắt tỉa git fetch! Xem câu trả lời của tôi dưới đây
VonC

Câu trả lời:


395

Kể từ git 1.8.5 (Q4 2013) :

" git fetch" (do đó " git pull" cũng vậy) đã học cách kiểm tra các biến cấu hình " fetch.prune" và " remote.*.prune" và hành xử như thể --prunetùy chọn dòng lệnh "" được đưa ra.

Điều đó có nghĩa là, nếu bạn đặt remote.origin.prune thành true:

git config remote.origin.prune true

Bất kỳ git fetchhoặc git pullsẽ tự động cắt tỉa.

Lưu ý: Git 2.12 (Q1 2017) sẽ sửa một lỗi liên quan đến cấu hình này, điều này sẽ gây ra git remote renamelỗi.
Xem " Làm cách nào để đổi tên một git remote? ".


Xem thêm tại cam kết 737c5a9 :

Không có " git fetch --prune", các nhánh theo dõi từ xa cho một nhánh mà phía bên kia đã xóa sẽ tồn tại mãi mãi.
Một số người muốn luôn luôn chạy " git fetch --prune".

Để phù hợp với người dùng muốn cắt tỉa luôn hoặc khi tìm nạp từ một điều khiển cụ thể, hãy thêm hai biến cấu hình mới " fetch.prune" và " remote.<name>.prune":

  • " fetch.prune" cho phép kích hoạt cắt tỉa cho tất cả các hoạt động tìm nạp.
  • " remote.<name>.prune" Cho phép thay đổi hành vi trên mỗi điều khiển từ xa.

Cái sau sẽ tự nhiên ghi đè lên cái trước, và --[no-]prunetùy chọn từ dòng lệnh sẽ ghi đè mặc định được cấu hình.

--prunelà một hoạt động có khả năng phá hủy (Git chưa tiếp tục cập nhật cho các tài liệu tham khảo đã bị xóa), nên chúng tôi không muốn cắt xén nếu không có sự đồng ý của người dùng, do đó, cấu hình này sẽ không được bật theo mặc định.


4
Điều này thực sự được bao gồm trong git 1.8.5 được phát hành
Bessey

1
Tôi muốn hành vi này theo mặc định trong tất cả các repos git của tôi. Có một số nơi tôi có thể đặt cái này trong .gitconfig để thực hiện điều đó không?
Andrew

47
@Andrew một khởi đầu tốt sẽ làgit config --global fetch.prune true
VonC

1
những nhược điểm có thể xảy ra để luôn luôn cắt tỉa khi kéo? trích dẫn đề cập rằng lịch sử reflog bị ảnh hưởng ... nhưng vấn đề thực tế nào có thể giới thiệu?
Grapho

3
@Grapho không có nhược điểm thực sự nhưng ... xem thêm tại stackoverflow.com/a/39862779/6309
VonC

142

git config --global fetch.prune true

Để luôn luôn --prunecho git fetchgit pulltrong tất cả các kho Git của bạn:

git config --global fetch.prune true

Lệnh trên sẽ nối thêm trong cấu hình Git toàn cầu của bạn (thông thường ~/.gitconfig) các dòng sau. Sử dụng git config -e --globalđể xem cấu hình toàn cầu của bạn.

[fetch]
    prune = true

git config remote.origin.prune true

Để luôn luôn --prunenhưng từ một kho lưu trữ duy nhất:

git config remote.origin.prune true
                 #^^^^^^
                 #replace with your repo name

Lệnh trên này thêm vào cấu hình Git cục bộ của bạn (thường .git/config) ở dòng cuối cùng bên dưới. Sử dụng git config -eđể xem cấu hình cục bộ của bạn.

[remote "origin"]
    url = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    fetch = +refs/heads/*:refs/remotes/origin/*
    prune = true

Bạn cũng có thể sử dụng --globaltrong lệnh thứ hai hoặc sử dụng thay thế --localtrong lệnh đầu tiên.


git config --global gui.pruneDuringFetch true

Nếu bạn sử dụng, git guibạn cũng có thể quan tâm bằng cách:

git config --global gui.pruneDuringFetch true

có thêm:

[gui]
    pruneDuringFetch = true

Người giới thiệu

Các tài liệu tương ứng từ git help config:

--global

  Đối với tùy chọn ghi: ghi vào ~/.gitconfigtệp toàn cầu thay vì kho lưu trữ .git/config, ghi vào $XDG_CONFIG_HOME/git/configtệp nếu tệp này tồn tại và ~/.gitconfigtệp không.

 

--local

  Đối với tùy chọn ghi: ghi vào .git/configtệp kho lưu trữ . Đây là hành vi mặc định.

 

fetch.prune

  Nếu đúng, tìm nạp sẽ tự động hành xử như thể --prunetùy chọn được đưa ra trên dòng lệnh. Xem thêm remote.<name>.prune.

 

gui.pruneDuringFetch

  "true" nếu git-gui nên cắt tỉa các nhánh theo dõi từ xa khi thực hiện tìm nạp. Giá trị mặc định là "sai".

 

remote.<name>.prune

  Khi được đặt thành true, việc tìm nạp từ xa này theo mặc định cũng sẽ xóa mọi tham chiếu theo dõi từ xa không còn tồn tại trên điều khiển từ xa (như thể --prunetùy chọn được đưa ra trên dòng lệnh). Ghi đè fetch.prunecài đặt, nếu có.


1
Lưu ý bên: Tôi chỉ tìm hiểu về git config -egit config -e --globaltừ bài viết này. Không còn phải gõ vimcác lệnh để trỏ đến một đường dẫn cụ thể đến tệp cấu hình git và phải suy nghĩ về đường dẫn cụ thể đó là gì.
ecbrodie

1
Bây giờ đây là một câu trả lời bạn có thể làm việc với. Cảm ơn rât nhiều.
sebingel

Câu trả lời này khá kỹ lưỡng, nhưng rất khó đọc vì định dạng của nó. Tôi đã tìm thấy "Luôn luôn - cung cấp cho git fetch và git pull trong tất cả các kho Git của bạn: git config --global fetch.prune true" cũng tốt như vậy (với một liên kết đến các tài liệu có liên quan).
Thibaud Colas

19

Nếu bạn muốn luôn luôn prunekhi bạn fetch, tôi có thể đề nghị sử dụng Bí danh .

Chỉ cần gõ git config -eđể mở trình soạn thảo của bạn và thay đổi cấu hình cho một dự án cụ thể và thêm một phần như

[alias]
pfetch = fetch --prune   

khi bạn tìm nạp với git pfetchtỉa sẽ được thực hiện tự động.


Tôi hiểu. Kéo theo cách này sẽ sử dụng git fetch chứ không phải git pfetch ... tôi có nên trực tiếp có bí danh cho pull không?
Edmondo1984

1
Tôi sẽ. Bằng cách này, bạn có cả hai tùy chọn, bình thường pullfetchphiên bản cắt tỉa của chúng. Trên thực tế, tôi nghĩ (nhưng tôi chưa thử) bạn có thể viết fetch = fetch --prunetrực tiếp trong phần bí danh và do đó pullsẽ tự động sử dụng tính năng tìm nạp được cắt tỉa
ThanksForAllTheFish

2
Theo như tôi biết fetch = fetch --prunekhông hoạt động, việc ghi đè một lệnh bằng bí danh không có tác dụng với tôi. Điều này có thể là do tôi đang sử dụng một phiên bản cũ (1.7.2.5)
Uipko

3
Từ tài liệu cấu hình git: "Để tránh nhầm lẫn và rắc rối với việc sử dụng tập lệnh, các bí danh ẩn các lệnh Git hiện có sẽ bị bỏ qua."
Dewayne Christensen
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.