Thay đổi từ xa Git 'đẩy thành' mặc định


228

Tôi muốn thay đổi đích nhánh từ xa mặc định Git để tôi có thể

git push

Thay vì:

git push upstream

Hiện tại điều này được đặt thành điều khiển từ xa gốc và tôi muốn đặt nó thành một điều khiển từ xa khác.

Tôi đã cố gắng loại bỏ bản gốc (nhân bản từ)

git remote rm origin

Mà đã loại bỏ các điều khiển từ xa ban đầu. Nhưng không giải quyết được git pushvấn đề. Tôi vẫn nhận được:

gây tử vong: Không có cấu hình đích đẩy. Chỉ định URL từ dòng
lệnh hoặc định cấu hình kho lưu trữ từ xa bằng cách sử dụng ...

Tôi cũng đã thử chơi với:

git remote set-url --push myfork origin

và các tùy chọn khác nhưng dường như không có gì hoạt động (có thể vì tôi đã xóa điều khiển từ xa quá sớm?)

Theo câu trả lời ở đây tôi đã cố gắng thay đổi:

git config push.default upstream (or matching)

nhưng không làm việc

Câu trả lời:


215

Bạn có thể sử dụng git push -u <remote_name> <local_branch_name>để đặt ngược dòng mặc định. Xem tài liệu cho git đẩy để biết thêm chi tiết.


1
Không hoạt động: Tôi nhận được '' 'gây tử vong:' nguồn gốc 'dường như không phải là một kho lưu trữ git gây tử vong: Đầu từ xa bị treo bất ngờ' '' có thể do tôi đã xóa nguồn gốc từ xa trước khi tiếp tục. vừa tìm thấy một giải pháp hiệu quả, tôi sẽ cập nhật trong câu trả lời
alonisser

34
Như một sự làm rõ bổ sung, cú pháp nên được git push -u <remote_name> <local_branch_name>:<corresponding_remote_branch_name>.
Marco Lazzeri

33
Ví dụ : git push -u origin master:master.
starbeamrainbowlabs

1
Sau khi thiết lập một điều khiển từ xa mặc định ... dù sao bạn cũng có thể buộc git pushphải đẩy chi nhánh từ xa của chi nhánh địa phương hiện tại? Tôi có nghĩa là làm điều này có nghĩa là tôi phải chạy lệnh này cho mọi chi nhánh. Đúng? Tôi không thể thực hiện một thiết lập ban đầu cho toàn bộ repo? @MarcoLazzeri
Mật ong

2
@starbeamrainbowlabs Không git push -u origin masterđủ? Bạn chỉ đang minh họa cú pháp đầy đủ?
Josiah Yoder

108

Để thay đổi điều khiển từ xa ngược dòng nào là "có dây" với chi nhánh của bạn, hãy sử dụng git branchlệnh với cờ cấu hình ngược dòng.

Đảm bảo điều khiển từ xa tồn tại trước:

git remote -vv

Đặt điều khiển từ xa ưa thích cho nhánh hiện tại (đã thanh toán):

git branch --set-upstream-to <remote-name>

Xác thực nhánh được thiết lập với điều khiển từ xa ngược dòng chính xác:

git branch -vv


2
Chỉ cần thử git branch --set-upstream-to myforkvà gặp lỗi:> lỗi: tùy chọn không xác định `set-upstream-to 'Tôi đang chạy git 1.7.9
alonisser

3
Cú pháp đã thay đổi trong 1.8, xem stackoverflow.com/questions/520650/ từ
jtniehof

1
Xem câu trả lời sau: stackoverflow.com/a/2432799/1820106 ( git remote set-url origin PATH_TO_REMOTE)
Yinon Ehrlich

10
git branch -u <remotename>/<branch>đã làm cho tôi. Lệnh đã được chạy với chi nhánh quan tâm địa phương được kiểm tra. Xem 'theo dõi Chi nhánh' trong git-scm.com/book/it/v2/Git-Branching-Remote-Branches
Norio

2
Đầu ra verbose lệnh từ xa thực sự chỉ là git remote -vhoặc git remote --verbose. Các -vv's thêm v là không cần thiết.
Artif3x

45

Làm việc với Git 2.3.2 ...

git branch --set-upstream-to myfork/master

Bây giờ status, pushpullđược chỉ đến myforktừ xa


Điều này hoạt động khi bạn chỉ muốn đặt mặc định pulllà tốt.
StingyJack

39

Bạn có thể dễ dàng thay đổi điều khiển từ xa mặc định cho tất cả các chi nhánh cùng một lúc bằng cách sử dụng lệnh này

git push -u <remote_name> --all

14
Chỉ cần lưu ý, điều này sẽ đẩy tất cả chúng, cũng như thay đổi điều khiển từ xa ngược dòng của chúng.
poolie

16

Nếu bạn đã thực hiện git push origin -u localBranchName:remoteBranchNamevà thực hiện các git pushlệnh tuần tự , bạn sẽ gặp lỗi mà nguồn gốc không tồn tại, thì hãy làm theo các bước sau:

  1. git remote -v

Kiểm tra nếu có bất kỳ điều khiển từ xa mà tôi không quan tâm. Xóa chúng vớigit remote remove 'name'

  1. git config --edit

Tìm kiếm các dấu hiệu có thể của một điều khiển từ xa cũ / không tồn tại. Tìm kiếm pushdefault:

[remote]
  pushdefault = oldremote

Cập nhật oldremotegiá trị và tiết kiệm.

git push nên làm việc bây giờ


2
Cảm ơn! Tôi có xu hướng thêm -ukhi sử dụng git pushvào một điều khiển từ xa khác do bộ nhớ cơ. Điều này làm cho điều khiển từ xa trở thành mặc định, thiết lập lại bằng cách sử dụng git config --edit(hoặc đẩy lại và đặt một điều khiển từ xa mới) đã giải quyết vấn đề.
Tim Visée

13

Chỉ cần làm rõ (sử dụng phiên bản git 1.7.9.5 trên Ubuntu 12.04):

Git sẽ thêm / xóa điều khiển từ xa. Đây là những trường hợp từ xa của git với một máy chủ được đính kèm.

git remote add myremote git://remoteurl

Sau đó, bạn có thể tìm nạp kho git đã nói như vậy:

git fetch myremote

Có vẻ như điều này tạo ra một nhánh có tên 'myremote', tuy nhiên điều khiển từ xa cho nhánh không được đặt tự động. Để làm điều này, bạn phải làm như sau:

Đầu tiên, xác minh rằng bạn có vấn đề này, tức là

git config -l | grep myremote

Bạn sẽ thấy một cái gì đó như:

remote.myremote.url=git://remoteurl
remote.myremote.fetch=+refs/heads/*:refs/remotes/myremote/*
branch.myremote.remote=.
branch.myremote.merge=refs/heads/master

Nếu bạn thấy branch.myremote.remote=., sau đó bạn nên tiến hành:

git config branch.myremote.remote myremote
git checkout myremote
git pull

Bây giờ bạn sẽ được cập nhật với kho lưu trữ từ xa và các lần kéo / đẩy của bạn phải được gắn với điều khiển từ xa thích hợp. Bạn có thể chuyển từ xa theo cách này, trên mỗi chi nhánh . [Lưu ý] [1]

Theo Tài liệu cấu hình Git chính thức , bạn có thể thiết lập một nhánh đẩy mặc định (chỉ cần tìm kiếm remote.pushdefault trên trang đó), tuy nhiên hãy nhớ rằng điều này sẽ không ảnh hưởng đến kho / nhánh đã tồn tại, vì vậy điều này sẽ hoạt động nhưng chỉ cho các kho / chi nhánh mới. Bạn nên nhớ rằng --globalsẽ đặt mặc định kho lưu trữ dành riêng cho người dùng (~ / .gitconfig), --systemsẽ đặt mặc định kho lưu trữ trên toàn hệ thống (/ etc / gitconfig) và không có cờ nào sẽ đặt tùy chọn cấu hình cho kho lưu trữ hiện tại (./.gitconfig).

Cũng cần lưu ý rằng push.default tùy chọn cấu hình là để cấu hình ref-spec hành vi, không xa hành vi.

[1]: git branch --set-upstream myotherremotethường sẽ hoạt động ở đây, tuy nhiên git sẽ phàn nàn rằng nó sẽ không đặt một nhánh làm điều khiển từ xa nếu git branch --set-upstream myremoteđược sử dụng. Tôi tin tuy nhiên đây là hành vi không chính xác.


Thay vì git config -l | grep myremote, bạn chỉ có thể sử dụng:git config --get branch.myremote.remote
Murmel 21/11/18

@Murmel trước tiên, đây là một wiki cộng đồng vì vậy hãy cải thiện, thứ hai, --getgiả sử hành vi cụ thể, tôi lưu ý rằng có nhiều cách khác để thiết lập ngược dòng nhưng điều này cung cấp một cách để tìm thông tin mà không chỉ dựa vào công cụ git chính xác. Git không hoàn hảo, tốt hơn là hiểu dữ liệu, những gì nó làm và sau đó hy vọng các yêu cầu của nó hoạt động phù hợp.
smaudet

10

Có thể hữu ích khi xem .git/configbên trong repo của bạn, nó sẽ liệt kê tất cả các điều khiển từ xa và cả điều khiển từ xa mặc định cho mỗi chi nhánh

ví dụ.

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@gitea.xxx.be:fii/web2016.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "bugfix/#8302"]
    remote = origin
    merge = "refs/heads/bugfix/#8302"
[branch "feature/#8331"]
    remote = origin
    merge = "refs/heads/feature/#8331"
[remote "scm"]
    url = https://scm.xxx.be/git/web2016bs.git
    fetch = +refs/heads/*:refs/remotes/scm/*

bạn có thể thực hiện các thay đổi thủ công trong tệp này để xóa một điều khiển từ xa không mong muốn hoặc cập nhật các điều khiển từ xa mặc định cho các nhánh khác nhau mà bạn có

  • Chú ý! khi thay đổi hoặc xóa điều khiển từ xa, hãy đảm bảo cập nhật tất cả các tham chiếu đến nó trong tệp cấu hình này

5

Một kỹ thuật khác tôi vừa tìm thấy để giải quyết vấn đề này (ngay cả khi tôi đã xóa nguồn gốc trước tiên, điều có vẻ là một lỗi) là thao tác trực tiếp với git config:

git config remote.origin.url url-to-my-other-remote

5
Đây không phải là một giải pháp tốt, người dùng git sẽ có thể kéo / đẩy từ nhiều kho lưu trữ - mặc dù điều này sẽ cho phép bạn thay đổi điều khiển từ xa ban đầu, điều đó không có nghĩa là bạn NÊN thay đổi điều khiển từ xa ban đầu, vì điều này có thể có nghĩa là có là một số không tương thích giữa các điều khiển từ xa. Hợp nhất sẽ giúp ở đây, nhưng nó đơn giản hơn và bảo tồn nhiều lịch sử hơn để đặt điều khiển từ xa trên nhánh mới.
smaudet

Không phải là cách làm đúng đắn ... Câu trả lời của Jordan là phù hợp hơn
Raja Anbazhagan

1
Xem thêm: stackoverflow.com/a/2432799/1820106 ( git remote set-url origin PATH_TO_REMOTE)
Yinon Ehrlich

5

Rất đơn giản, và cùng nhau đưa ra một số ý kiến ​​tuyệt vời ở đây cùng với nghiên cứu của riêng tôi về vấn đề này.

Trước tiên, hãy kiểm tra chi nhánh địa phương bạn muốn liên kết với chi nhánh từ xa của bạn:

git checkout mybranch

Kế tiếp:

git branch -u origin/mybranch

Ở đâu:

git branch -u {remote name}/{branch name}

Bạn sẽ nhận được một tin nhắn:

"Branch mybranch set up to track remote branch mybranch from origin."

3

Trong trường hợp của tôi, tôi đã sửa bằng cách sau: * run git config --edit * Trong tệp cấu hình git:

[branch "master"]
remote = origin # <--- change the default origin here

0

git remote set-url --push origin nên hoạt động, như bạn đã đề cập, nhưng bạn cần cung cấp rõ ràng url thay vì một tên từ xa thay thế, ví dụ:

git remote set-url --push origin git@github.com:contributor/repo.git

Bạn có thể xác nhận liệu này làm việc bằng cách làm một git remote -v. Ví dụ

λ ~/go/src/github.com/stretchr/testify/ master git remote -v
fork    git@github.com:contributor/testify.git (fetch)
fork    git@github.com:contributor/testify.git (push)
origin  git@github.com:stretchr/testify (fetch)
origin  git@github.com:contributor/testify.git (push)
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.