2011-01-02 27 views
29

Tôi đã thiết lập các nhánh theo dõi với tùy chọn --track và khi tôi thực hiện git pull trên master, nó sẽ lấy tất cả các chi nhánh đến origin/branchname nhưng không hợp nhất với các nhánh theo dõi cục bộ . Điều này gây phiền phức hơn, bởi vì nếu sau này tôi làm một số git push trên master, nó nói rằng các bản cập nhật không nhanh về phía trước đã bị từ chối trên các nhánh theo dõi, vì chúng không được chuyển tiếp nhanh trên git pull ban đầu.Git - Tự động chuyển tiếp nhanh chóng tất cả các nhánh theo dõi khi kéo

Câu hỏi của tôi là: Làm cách nào để tạo thành git pull với tìm nạp tất cả các nhánh và tự động chuyển tiếp nhanh tất cả các nhánh theo dõi?

Lưu ý: git pull được sử dụng để chuyển tiếp nhanh tất cả các chi nhánh theo dõi bằng repo GitHub, nhưng bây giờ tôi đã thiết lập repos của riêng mình bằng Gitolite, sự cố này đang bị xén.

+0

Bạn có thể hiển thị các lệnh chính xác mà bạn đang sử dụng? Làm một 'git push' trên nhánh' master' của bạn sẽ đẩy bất cứ thứ gì trừ nhánh master của bạn và nếu bạn không thực hiện bất kỳ thay đổi nào với master thì bạn không nên cố gắng đẩy nó lên. –

+1

Tôi không chắc chắn công việc của bạn là gì nhưng phản ứng ngay lập tức của tôi là bạn không cần phải tạo các nhánh theo dõi cục bộ nếu bạn không thực hiện bất kỳ công việc nào (ví dụ: trường hợp chúng có thể được chuyển tiếp nhanh); các nhánh theo dõi từ xa ('origin/*') được tự động cập nhật và có sẵn để bạn tham khảo trong mọi trường hợp. –

+0

@CharlesBailey Đây là một ví dụ: Nhiều nhà phát triển chia sẻ một bộ các chi nhánh, và làm việc trên tất cả trong số họ ít nhất là đôi khi, nhưng thường là khi kéo cập nhật hầu hết các chi nhánh có thể được chuyển tiếp nhanh. – bames53

Trả lời

5

Nhưng chờ:

Lưu ý: Tôi cho rằng bạn đã theo dõi tất cả các chi nhánh từ xa của bạn như trong "Track all remote git branches as local branches."


Lưu ý: Git 2.0 (Quý 2 năm 2014) sẽ giới thiệu với commit b814da8 một push.ff config:

pull.ff:: 

Theo mặc định, Git không tạo thêm cam kết hợp nhất khi hợp nhất một cam kết là hậu duệ của cam kết hiện tại. Thay vào đó, đầu của nhánh hiện tại được chuyển tiếp nhanh.

  • Khi thiết lập để false, biến này cho Git để tạo ra một kết hợp thêm cam kết trong trường hợp này (tương đương với việc --no-ff lựa chọn từ dòng lệnh).
  • Khi được đặt thành only, chỉ cho phép hợp nhất nhanh về phía trước đó (tương đương với việc cung cấp tùy chọn --ff-only từ dòng lệnh).
0

SmartGit, ví dụ, có một tùy chọn để tự động nhập các thay đổi từ chi nhánh theo dõi nếu bạn chuyển sang một chi nhánh. Điều này nên làm những gì bạn muốn đạt được.

+0

Tập lệnh cụ thể này cũng có tác dụng phụ không mong muốn ở chỗ nó thay đổi nhánh hiện tại. Có cách nào để sửa đổi nó để giữ cho chi nhánh hiện tại không? –

1

Nếu bạn thực sự muốn nhanh chóng chuyển tiếp tất cả các chi nhánh địa phương đang theo dõi các chi nhánh từ xa bạn có thể muốn cân nhắc việc thêm này như một bí danh để ~/.gitconfig của bạn:

[alias] 
    pull-all = !"for b in $(git for-each-ref refs/heads --format='%(refname)') ; do git checkout ${b#refs/heads/} ; git pull --ff-only ; done" 

Sau đó, bạn có thể chạy git pull-all, nó sẽ lặp qua các chi nhánh địa phương của bạn và chạy git pull --ff-only trên mỗi chi nhánh.

+1

'checkout' có thể không mong muốn vì nó yêu cầu cập nhật cây đang hoạt động, có thể kích hoạt các bản cập nhật trong IDE hoặc bất cứ thứ gì khác đang xem tệp. Để tránh điều đó, bạn có thể sử dụng 'update-ref' thay vào đó, như được thấy ở đây: http://stackoverflow.com/questions/5147537/how-do-i-fast-forward-other-tracking-branches-in-git# 5148202 – joeytwiddle

+0

Tôi thực hiện một dự đoán ngây thơ rằng các chi nhánh theo dõi là nguồn gốc/$ local_branch: 'merge-all =!" Cho local_branch trong $ (git cho mỗi ref ref/heads - format = \ "% (refname: short) \ "); làm remote_branch = \" origin/$ local_branch \ "; local_commit = $ (git rev-parse --verify \" $ local_branch \ "); remote_commit = $ (git rev-parse --verify \" $ remote_branch \ "); common_ancestor = $ (git merge-base $ local_branch $ remote_branch); nếu [! \" $ common_ancestor \ "= \" $ local_commit \ "]; sau đó echo \" Không thể chuyển tiếp nhanh: $ local_branch \ "> & 2; else git update-ref refs/heads/$ local_branch $ remote_commit $ local_commit; fi được thực hiện" ' – joeytwiddle

8

Shell script mà nhanh chuyển tiếp tất cả các chi nhánh có bộ chi nhánh thượng nguồn của mình cho phù hợp với nguồn gốc/chi nhánh mà không làm bất kỳ Thanh toán

  • nó không thay đổi chi nhánh hiện tại của bạn bất cứ lúc nào, không cần phải đối phó với những thay đổi bản sao làm việc và thời gian bị mất kiểm tra ra

  • nó chỉ không nhanh về phía trước, chi nhánh có thể không được tua nhanh sẽ hiển thị một thông báo lỗi và sẽ bị bỏ qua

Đảm bảo rằng tất cả các nhánh nhánh của nhánh của bạn được đặt chính xác bằng cách chạy git branch -vv. Đặt chi nhánh thượng nguồn với git branch -u origin/yourbanchname

Sao chép-dán vào một tập tin và chmod 755:

#!/bin/sh 

curbranch=$(git rev-parse --abbrev-ref HEAD) 

for branch in $(git for-each-ref refs/heads --format="%(refname:short)"); do 
     upbranch=$(git config --get branch.$branch.merge | sed 's:refs/heads/::'); 
     if [ "$branch" = "$upbranch" ]; then 
       if [ "$branch" = "$curbranch" ]; then 
         echo Fast forwarding current branch $curbranch 
         git merge --ff-only origin/$upbranch 
       else 
         echo Fast forwarding $branch with origin/$upbranch 
         git fetch . origin/$upbranch:$branch 
       fi 
     fi 
done; 
Các vấn đề liên quan