2010-03-08 28 views
15

Tôi đang cố gắng tạo một nhánh phân nhánh trên Heroku, nhưng có một thứ tôi không nhận được.Git đẩy nhánh hiện tại vào điều khiển từ xa với Heroku

Giả sử tôi đã tạo ra một ứng dụng Heroku và thiết lập điều khiển từ xa để trỏ đến dàn-xa, Nếu tôi làm:

git checkout -b staging staging-remote/master 

tôi nhận được một chi nhánh địa phương gọi là 'dàn' mà theo dõi dàn dựng-xa/thạc sĩ - hoặc đó là những gì tôi nghĩ ....

Nhưng:

git remote show staging-remote 

Cung cấp cho tôi điều này:

remote staging 
    Fetch URL: [email protected]:myappname.git 
    Push URL: [email protected]:myappname.git 
    HEAD branch: master 
    Remote branch: 
    master tracked 
    Local branch configured for 'git pull': 
    staging-remote merges with remote master 
    Local ref configured for 'git push': 
    master pushes to master (up to date) 

Như bạn có thể thấy, kéo có vẻ hợp lý, nhưng đẩy mặc định thì không. Điều đó ngụ ý rằng nếu tôi làm:

git push dàn-xa

tôi sẽ đẩy ngành thạc sĩ địa phương của tôi đến chi nhánh dàn. Nhưng đó không phải là những gì tôi muốn .... Về cơ bản, tôi muốn kết hợp cập nhật vào chi nhánh dàn của tôi, sau đó dễ dàng đẩy nó vào Heroku mà không cần phải xác định các chi nhánh như sau:

git push staging-remote mybranch:master 

Ở trên là không khó để làm, nhưng tôi muốn tránh vô tình làm việc đẩy trước đó và đẩy nhánh sai ... Đây là điều quan trọng gấp đôi cho ngành sản xuất mà tôi muốn tạo ra!

Tôi đã thử rối tung với git config, nhưng chưa tìm ra cách để có được quyền này chưa ...

Trả lời

25

Tôi đã thử nghiệm nó và các phiên bản @juba và @ MatthewFord hoạt động hoàn hảo!

git config remote.staging.push staging:master 

này đẩy địa phương chi nhánh chủ đề của tôi tên là dàn dựng vào chi nhánh từ xa chủ trên kho lưu trữ từ xa tên dàn dựng.

@nickgrim đặt nó trong dạng tổng quát như sau:

git config remote.[remoteRepositoryName].push [localBranchName]:[remoteBranchName] 

Cập nhật:

Hơn nữa, git hiện đại sẽ thuận tiện chạy lệnh cấu hình trên cho bạn khi bạn git push với các tùy chọn -u :

git push -u staging staging:master 
+1

nói cách khác: > git config từ xa [localBranchName] .push [ở xa]:. [RemoteBranchName] –

+2

@DavidAlpert: nope, bạn đã có mà ngược; bạn muốn: 'git config remote. [remoteName] .push [localBranchName]: [remoteBranchName]' – nickgrim

+0

@nigkgrim hoàn toàn chính xác. – thekingoftruth

1

Từ trang Everiday Git với 20 lệnh hoặc lâu hơn:

http://www.kernel.org/pub/software/scm/git/docs/everyday.html

dường như t mũ bạn có thể đạt được những gì bạn muốn làm bằng cách thêm một chỉ thị cấu hình để kho git địa phương của bạn, một cái gì đó như:

git config remote.staging-remote.push mybranch:refs/remotes/staging-remote/master 

Sau đó, nếu bạn làm một git push từ mybranch bạn chi nhánh địa phương, nó phải được đẩy lên chi nhánh chính của điều khiển từ xa dàn từ xa.

Tuy nhiên, xin vui lòng xác minh với git remote show staging-remote và cẩn thận kiểm tra nó trước khi sử dụng nó, vì tôi xa một chuyên gia git ...

7

Tôi có một chi nhánh gọi Heroku, và điều này đã làm việc cho tôi:

git config remote.heroku.push heroku:master 

sự cố bạn đang gặp phải là heroku bỏ qua tất cả các nhánh khác ngoài chủ.

0

Tôi đang gặp vấn đề tương tự khi tìm cách giải quyết chính sách của Heroku về việc bỏ qua tất cả các chi nhánh nhưng 'chủ'.Nó kinda đánh bại toàn bộ các điểm giữ các chi nhánh riêng biệt nếu bạn chỉ có thể kiểm tra các chi nhánh chủ trên Heroku. Hệ quả của hạn chế này là bất kỳ nhánh chủ đề địa phương nào tôi có thể đang làm việc, tôi muốn có một cách dễ dàng để chuyển Master của Heroku đến nhánh chủ đề địa phương đó và thực hiện "git push -f" để ghi đè quá mức. làm chủ trên Heroku. Không cần phải nói, nó sẽ là một ý tưởng rất tốt để có một kho lưu trữ từ xa riêng biệt (như Github), để sao lưu mọi thứ mà không có sự hạn chế này. Tôi muốn gọi đó là "nguồn gốc" và sử dụng "heroku" cho Heroku để "git push" luôn sao lưu mọi thứ.

gì tôi nhận được từ đọc "Pushing Refspecs" của http://progit.org/book/ch9-5.html

git push Heroku địa phương chủ đề ngành: refs/con/chủ

Những gì tôi thực sự muốn là một cách để thiết lập điều này trong tập tin cấu hình để "git push heroku" luôn làm như trên, thay thế "local-topic-branch" với tên của bất kỳ nhánh hiện tại nào của tôi sẽ xảy ra.

Tôi có thể hỏi đây là câu hỏi mới, để xem liệu có ai khác đã tìm ra cách thực hiện việc này hay không.

+1

'git config remote.heroku.push ĐẦU: master' –

3

Từ trang "O’Reilly - Kiểm soát phiên bản với Git" 184 | Chương 11: Kho lưu trữ từ xa

Trong quá trình vận hành git, bạn thường muốn cung cấp và xuất bản các thay đổi bạn đã tạo trên các nhánh chủ đề địa phương. Để cho phép người khác tìm thấy các thay đổi của bạn trong kho lưu trữ từ xa sau khi bạn tải chúng lên, các thay đổi của bạn phải xuất hiện trong kho lưu trữ đó dưới dạng các nhánh chủ đề. Như vậy, trong một lệnh git push điển hình, các chi nhánh nguồn từ kho của bạn được gửi đến kho lưu trữ từ xa sử dụng một refspec như:

+refs/heads/*:refs/heads/* 

refspec này có thể được diễn giải như sau: Từ kho địa phương, uống mỗi tên chi nhánh được tìm thấy trong không gian tên nguồn refs/heads/ và đặt nó trong một chi nhánh được đặt tên tương tự, tương tự dưới đích không gian tên refs/heads/ trong kho lưu trữ từ xa. refs/heads/ đầu tiên đề cập đến kho lưu trữ cục bộ của bạn (vì bạn đang thực hiện một lần đẩy), và thứ hai đề cập đến kho lưu trữ từ xa. Các dấu hoa thị đảm bảo rằng tất cả các chi nhánh được nhân rộng. ...


Đó là lý do ví dụ từ Juba nên thất bại. chỉnh sửa refspec phải là:

git config remote.staging-remote.push +refs/heads/local_branch_name:refs/heads/master 
0

Công trình này hoạt động. Tôi đã sử dụng nó nhiều lần để thiết lập máy khách với luồng git, heroku và một dịch vụ sao lưu.

.git/config cho repo:

[core] 
    repositoryformatversion = 0 
    filemode = true 
    bare = false 
    logallrefupdates = true 
    ignorecase = true 
[heroku] 
    account = youraccount 
[remote "origin"] 
    url = [email protected]:youruser/yoursite.heroku.com.git # or github, etc. 
    fetch = +refs/heads/*:refs/remotes/origin/* 
[branch "master"] 
    remote = origin 
    merge = refs/heads/master 
[branch "staging"] 
    remote = origin 
    merge = refs/heads/staging 
[branch "develop"] 
    remote = origin 
    merge = refs/heads/develop 
[remote "production"] 
    pushurl = [email protected]:your-prod-app.git 
    push = master:master 
[remote "staging"] 
    pushurl = [email protected]:your-staging-app.git 
    push = staging:master 

Tất cả các hoạt động chính xác:

git push origin

git pull origin

git push staging

git push production

Hãy suy nghĩ về tìm nạp và đẩy như stdout và stdin, trong đó cả hai có thể được chuyển hướng hoặc đóng lại theo một cách. Ngoài ra nếu có ai biết làm thế nào để có được những cài đặt này mà không cần hack .git/config, xin vui lòng sửa đổi với một chỉnh sửa, điểm nghiệp chắc chắn sẽ làm theo.

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