2012-03-21 47 views
8

Tôi chỉ phát hiện ra rằng mặc dù rebase phần trong git help svn nóiCách git svn fetch + rebase trong một thao tác?

này fetches sửa đổi từ phụ huynh SVN của các HEAD hiện tại và rebases dòng điện (không bị giam để SVN) làm việc chống lại nó.

(tôi nhấn mạnh) nó không có nghĩa là rebasebao gồm một git svn fetch. Đặt tên sang một bên, có cách nào để chạy một lệnh đơn git svn để thực hiện cả hai?

Lý do tôi muốn làm điều này là tôi chỉ ghi trên một chi nhánh, vì vậy tôi muốn rebase rằng một và tôi thường xuyên đọc chi nhánh khác, vì vậy tôi muốn fetch những.

+0

Tôi không có kinh nghiệm với 'git svn' nhưng thông thường' git pull' có thể được cấu hình để sử dụng 'rebase' thay vì' merge' và cách này thực hiện cả hai bước bạn muốn. Tôi sẽ đăng một câu trả lời nếu tôi biết làm thế nào để làm điều đó với 'git svn' - chỉ cần tìm một tương đương với' git config branch.autosetuprebase luôn'. –

+0

Nó có nghĩa là. Cứ thử đi. Đầu tiên nó nạp và sau đó nó khởi động lại. –

+2

Không, không. 'git svn rebase' không * không * lấy nhánh mới từ xa, trong khi' git svn fetch' thực hiện. Tôi vừa thử nó. – l0b0

Trả lời

8

Tôi cũng hơi ngạc nhiên khi biết rằng điều này thực sự là cách nó cư xử. Tuy nhiên, để trả lời câu hỏi của bạn, bạn chỉ cần xác định một bí danh:

git config --global alias.refetch '!git svn fetch && git svn rebase'

Sau đó git refetch nên làm những gì bạn muốn.

+0

Đủ công bằng; có vẻ như không có cách tiêu chuẩn để làm điều này. – l0b0

+0

lý do tại sao trên trái đất bạn muốn lấy tất cả các repo svn chỉ để rebase một duy nhất? –

+0

@ l0b0: Không có cách tiêu chuẩn để làm điều đó bởi vì nó không phải là một cách tiêu chuẩn của việc sử dụng 'git svn'. 'git svn rebase' được thiết kế để đưa nhánh hiện tại của bạn lên đầu Subversion, vì vậy nó bỏ qua bất kỳ nhánh Subversion nào khác trong tên giúp bạn nhận được một bản sao làm việc hữu ích một cách nhanh chóng. 'git svn fetch' cập nhật mọi thứ từ kho lưu trữ Subversion, và do đó thường là một hoạt động chậm hơn nhiều. Tôi thực sự bối rối về những gì bạn đang thực sự cố gắng để đạt được điều đó có nghĩa là bạn cần để có thể làm điều này. –

-3
git pull --rebase 

Bạn cũng có thể định cấu hình để nó khởi động lại theo mặc định. Sau đó, bạn có thể:

git pull 

UPDATE:

oops. Cần nhiều cà phê ...

Tất cả tôi có thể nghĩ đến là kịch bản những gì bạn cần ..

+0

kéo từ svn repo? –

+0

@AdamDymitruk: Đây là * không * về vanilla 'git' - Đó là về' git svn'. – l0b0

19

Tôi nghĩ bạn đang bối rối git rebasegit svn rebase. Các di chuyển trước cam kết với HEAD hiện tại của bạn lên một số sửa đổi mà bạn chỉ định, trong khi di chuyển thứ hai chuyển HEAD hiện tại của bạn lên đầu nhánh Subversion bạn đang truy cập.

git svn rebasekhông bao gồm git svn fetch --parent, tức là nó sẽ nhận được bất kỳ Subversion mới cam kết về chi nhánh bạn hiện đang sử dụng, nhưng không phải bất kỳ Subversion cam kết từ bất kỳ chi nhánh khác (tương phản với một đồng bằng git svn fetch, mà nạp từ tất cả các chi nhánh).

Tôi nghi ngờ bạn không muốn thực hiện đầy đủ git svn fetch khi bạn thực hiện git svn rebase, vì điều đó có nghĩa là sẽ lâu hơn trước khi bạn nhận được bản sao làm việc có thể sử dụng. Nếu bạn muốn thường xuyên git svn fetch es, tôi khuyên bạn nên thiết lập một công việc cron mà sẽ làm lấy trong nền cho bạn.

+0

bạn đang rất đúng –

+0

Khá một bài cũ nhưng tôi thấy nó vẫn có liên quan. Tôi TUYỆT ĐỐI muốn nhận được tất cả các bản cập nhật chi nhánh trước khi tôi làm một git svn rebase. Tại sao? Bởi vì tôi đã có nhiều vấn đề trong khi hợp nhất nếu tôi không làm điều này. Quá dễ dàng để quên tìm mỗi nhánh bạn muốn hợp nhất trước khi hợp nhất và thực hiện điều này: 'git svn rebase && git checkout master && git merge feature' trước khi thực hiện quá muộn mà bạn không cập nhật đúng nhánh từ SVN. Nếu một người đang sử dụng git svn để hỗ trợ phân nhánh tốt hơn, bạn nên biết rằng luôn luôn 'git svn fetch' mọi thứ trước khi rebasing. Nếu bạn không 'git svn dcommit' stomps trên tất cả mọi thứ. –

+0

Nếu có quá nhiều nhánh trong repo SVN và phải mất mãi mãi thì xóa '*' khỏi dòng 'branch:' và chỉ xử lý các nhánh bạn làm việc một cách bình thường. Nếu bạn đang thực hiện một kết hợp 'master -> dev -> feature', thật dễ dàng để chỉ đối phó với các nhánh đó bằng cách sử dụng các ký tự đại diện và tệp cấu hình git. Bằng cách này khi bạn 'git svn fetch' bạn không nhận được các nhánh không cần thiết. 'git svn rebase' đã hoàn toàn phá vỡ git và svn repo của tôi trong quá khứ bởi vì nó không svn lấy các chi nhánh trước khi tay. Nó không dịch tốt cho tôi. Tôi có thể là thiểu số ở đây. –

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