Làm cách nào để tạo kho lưu trữ Git với tên nhánh mặc định khác với tên "chính"?


83

Trong cuốn sách Pro Git , nó nói

"Origin" không phải là đặc biệt

Giống như tên nhánh “master” không có bất kỳ ý nghĩa đặc biệt nào trong Git, “origin” cũng vậy. Trong khi “master” là tên mặc định cho một nhánh bắt đầu khi bạn chạy git init, đây là lý do duy nhất khiến nó được sử dụng rộng rãi , thì “origin” là tên mặc định cho một điều khiển từ xa khi bạn chạy git clone. Nếu bạn chạy git clone -o booyah thay thế, thì bạn sẽ có booyah / master làm nhánh từ xa mặc định của mình.

Điều đó có nghĩa là, chúng ta có thể sử dụng tên chi nhánh mặc định của mình làm tên chính hoặc chi nhánh chính hoặc tương tự như vậy. Tôi không thấy bất kỳ tùy chọn man git-initnào sẽ khởi tạo của tôi repobằng một tên nhánh mặc định khác.

GitHub chỉ ra cách đặt tên chi nhánh mặc định trong trang cài đặt của nó. Nhưng tôi không nói về cách đặt nó trên bất kỳ trang web lưu trữ Git cụ thể nào . Tôi chỉ hỏi về Git, không liên quan đến bất kỳ trang web lưu trữ Git cụ thể nào .

Có cách nào làm được việc này không?


1
Một số công việc đã được bắt đầu để xem xét cách đặt tên của nhánh chính / mặc định trong github.com/git-for-windows/git/issues/2674 .
Philip Oakley

Câu trả lời:


78

Git mới hơn, Repo mới

Kể từ phiên bản git 2.28.0, git initlệnh bây giờ nhận một tham số --initial-branch(hoặc -bviết tắt). Hai lệnh này tạo ra một repo Git mới với một nhánh có tên là "trunk", đối với tôi luôn có ý nghĩa hơn là "master" (chủ của cái gì?):

git init --initial-branch=trunk
git init -b trunk

Điều này có thể cấu hình với init.defaultBranchcài đặt. Nếu tôi muốn tất cả các đại diện mới có "thân cây" làm nhánh mặc định:

git config --global init.defaultBranch trunk

Git cũ hơn, Repo mới

Một số hệ thống vẫn có cài đặt Git cũ hơn. Máy chủ Debian 10 của tôi (Buster, phiên bản ổn định hiện tại kể từ tháng 10 năm 2020) đi kèm với Git 2.20, không hỗ trợ -btùy chọn này. Một tùy chọn là tạo kho lưu trữ và sau đó thay đổi tên chi nhánh. Kỹ thuật này hoạt động đối với các repo thông thường (không trần):

git init
git checkout -b trunk

Điều này tạo ra một kho lưu trữ mới với trunklàm nhánh hiện tại thay vì master. Nhánh masterkhông thực sự tồn tại - các nhánh không được tạo cho đến khi chúng có ít nhất một cam kết. Cho đến khi nhánh được tạo, nhánh chỉ tồn tại trong .git/HEADđó, điều này giải thích tại sao masternhánh sẽ biến mất khi bạn chuyển sang trunk.

Bare Repos

Đối với các repo trần, bạn không thể chạy git checkout(đó là ý nghĩa của việc để trần). Thay vào đó, bạn có thể thay đổi HEAD để trỏ đến một nhánh khác:

git init --bare
git symbolic-ref HEAD refs/heads/trunk

Repos cũ

Nếu bạn đã cam kết, bạn có thể chạy git branch -m:

git init
touch file.txt
git add file.txt
git commit -m 'commit 1'
git branch -m trunk

Đây đổi tên chi nhánh từ masterđến trunkkhi nó đã được tạo ra.

Điều này có vẻ hơi rắc rối vì cơ chế khác nhau tùy thuộc vào việc kho lưu trữ có trống hay không, nhưng nó hoạt động. Bạn cũng có thể tiếp cận nó như là "tạo một nhánh mới và xóa master".


Trong trường hợp đầu tiên khi bạn chạy git checkout -b trunk. Có nghĩa là, từ đó trở đi nhánh mặc định là thân cây?
Abhisek

2
"Mặc định" là một từ nhầm lẫn một chút. "Chi nhánh hiện tại" thực sự là những gì đang xảy ra ở đây.
Dietrich Epp

help.github.com/articles/setting-the-default-branch nói về nhánh mặc định, vì vậy tôi hơi bối rối. Tôi đã làm một chút thử nghiệm về những gì bạn nói. hóa ra không có gì giống như "Mặc định" trong git. cảm ơn
Abhisek

4
Điều đó trông giống như một khái niệm GitHub, không phải một khái niệm Git. Nó nói về các yêu cầu kéo, và trong Git không có cái gọi là "yêu cầu kéo".
Dietrich Epp

Tôi chỉ đang tìm kiếm một thứ như thế này
Wexoni

91

Bạn có thể, gián tiếp, cấu hình git initđể sử dụng một nhánh mặc định khác: nhánh hiện tại được định nghĩa bởi HEAD, nó “chỉ là” một tệp văn bản cho Git biết ref nào là cái hiện tại.

Khi sử dụng init.templateDir, bạn có thể yêu cầu git initsử dụng một cái khác:

# ~/.config/git/config or ~/.gitconfig
[init]
    templateDir = ~/.config/git/template/

và trong ~/.config/git/template/HEAD, đặt một dòng duy nhất (+ ngắt dòng): ref: refs/heads/main(để mặc định là nhánh main).

Toàn bộ nội dung của templateDirđược sao chép vào .gitthư mục khi tạo kho lưu trữ; mặc định (ở đây /usr/share/git-core/templates) chứa một số móc mẫu và các tệp khác, nhưng bạn có thể sử dụng thư mục mẫu mới của mình để thiết lập móc mặc định, chẳng hạn.

$ tree /usr/share/git-core/templates
/usr/share/git-core/templates
├── branches
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
└── info
    └── exclude

3 directories, 13 files

FYI cho bất kỳ ai làm theo các hướng dẫn này trên OSX, bạn có thể phải xem / usr / local / git / share / git-core / templates để biết các tệp mẫu
Brian Gradin

1
NB: Bạn cũng có thể tạo một HEADtệp trong mẫu mặc định, mặc dù nó sẽ cho bạn biết bạn đang "khởi động lại" một kho lưu trữ khi bạn thực sự tạo một kho.
jhpratt

24

Làm cách nào để tạo kho lưu trữ Git với tên nhánh mặc định khác với " master"?

Bạn sẽ sử dụng Git 2.28 (Q3 2020): tên của nhánh chính trong các kho lưu trữ hiện có và tên mặc định được sử dụng cho nhánh đầu tiên trong các kho mới được tạo, có thể định cấu hình, để cuối cùng chúng ta có thể tự cai nghiện mã cứng ' master'.

Và lời nhắc từ tháng 8 năm 2020 từ GitHub :

Vào ngày 1 tháng 10 năm 2020, nếu bạn chưa thay đổi nhánh mặc định cho các kho lưu trữ mới cho người dùng, tổ chức hoặc doanh nghiệp của mình, nó sẽ tự động thay đổi từ masterthànhmain .
Bạn có thể chọn không tham gia thay đổi này bất kỳ lúc nào:

  • Đối với người dùng, trên trang https://github.com/settings/repositories
  • Đối với chủ sở hữu tổ chức, trên https://github.com/organizations/YOUR-ORGANIZATION/settings/repository-defaultstrang
  • Đối với quản trị viên doanh nghiệp, trên https://github.com/enterprises/YOUR-ENTERPRISE/settings/member_privilegestrang

Thay đổi này là một trong nhiều thay đổi mà GitHub đang thực hiện để hỗ trợ các dự án và người bảo trì muốn đổi tên nhánh mặc định của họ.
Để tìm hiểu thêm về những thay đổi chúng tôi đang thực hiện, hãy xem github / đổi tên .

Nhưng quay lại chính Git: (2.28, Q3 2020) Xem cam kết 508fd8e (29/06/2020) của Đoàn Trần Công Danh ( sgn) .
Xem cam kết 0068f21 , cam kết a471214 , cam kết 0cc1b47 , cam kết 32ba12d , cam kết 6069ecc , cam kết f0a96e8 , cam kết 4d04658 (24 tháng 6 năm 2020) và cam kết 489947c (23 tháng 6 năm 2020) bởi Johannes Schindelin ( dscho) .
Xem cam kết 8747ebb (24 tháng 6 năm 2020) của Don Goodman-Wilson ( DEGoodmanWilson) .
(Hợp nhất bởi Junio ​​C Hamano - gitster- incam kết 11cbda2 , ngày 06 tháng 7 năm 2020)

init: cho phép chỉ định tên nhánh ban đầu cho kho lưu trữ mới

Người ký hợp đồng: Johannes Schindelin

Ngày càng có nhiều dự án và công ty muốn thay đổi tên chi nhánh chính của kho lưu trữ của họ (xem ví dụ: tweet của Mislav Marohnić để biết thông tin cơ bản về điều này).

Để thay đổi tên nhánh đó cho các kho lưu trữ mới, hiện tại cách duy nhất để thực hiện điều đó tự động là sao chép tất cả thư mục mẫu của Git, sau đó mã hóa cứng tên nhánh mặc định mong muốn vào .git/HEADtệp, rồi định cấu hình init.templateDirđể trỏ đến các tệp mẫu đã sao chép đó.

Để thực hiện quá trình này ít hơn nhiều rườm rà, chúng ta hãy giới thiệu một tùy chọn mới: --initial-branch=<branch-name>.

git init --initial-branch=hello myLocalRepo
# or
git config --global init.defaultBranch hello
git init myLocalRepo

Và:

init: cho phép đặt giá trị mặc định cho tên nhánh ban đầu thông qua cấu hình

Người hỗ trợ: Johannes Schindelin Người trợ
giúp: Derrick Stolee
Người ký hợp đồng: Don Goodman-Wilson

Chúng tôi vừa giới thiệu tùy chọn dòng lệnh --initial-branch=<branch-name>để cho phép khởi tạo một kho lưu trữ mới với một nhánh ban đầu khác với nhánh được mã hóa cứng.

Để cho phép người dùng ghi đè tên nhánh ban đầu lâu dài hơn (nghĩa là không cần phải chỉ định tên theo cách thủ công cho mỗi và mọi lệnh git initgọi), hãy giới thiệu init.defaultBranchcài đặt cấu hình.

Lưu ý: commit 489947c , về thông báo hợp nhất, đã được hoàn nguyên trong Git 2.29, hãy xem " làm cách nào để tùy chỉnh thông báo cam kết hợp nhất của git? ".
Các init.defaultBranchthiết lập vẫn còn.


Điều này ảnh hưởng đến các mô-đun con:

submodule: quay lại HEAD của điều khiển từ xa vì thiếu điều khiển từ xa..branch

Người hỗ trợ: Philippe Blain
Người ký hợp đồng: Johannes Schindelin

Khi remote.<name>.branchkhông được cấu hình, git submodule updatehiện tại quay trở lại việc sử dụng tên nhánh master.
Tuy nhiên, một ý tưởng tốt hơn nhiều là sử dụng điều khiển từ xa HEAD: trên tất cả các máy chủ Git đang chạy các phiên bản Git gần đây, symref HEADtrỏ đến nhánh chính.

Lưu ý: t7419 chứng minh rằng có thể có các trường hợp sử dụng ngoài đó mong git submodule update --remote muốn cập nhật các mô-đun con cho masternhánh từ xa ngay cả khi từ xa HEADtrỏ đến nhánh khác.
Có thể cho rằng, bản vá này làm cho hành vi trực quan hơn, nhưng có một chút khả năng rằng điều này có thể gây ra hồi quy trong các thiết lập khó hiểu.

Mặc dù vậy, sẽ không sao để khắc phục hành vi này mà không cần bất kỳ điều gì giống như thời gian chuyển đổi dài hơn:

  • Các git submodule update --remotelệnh là không thực sự phổ biến.
  • Hành vi của Git hiện tại khi chạy lệnh này hoàn toàn khó hiểu, trừ khi nhánh hiện tại của kho lưu trữ từ xa master (trong trường hợp đó hành vi được đề xuất khớp với hành vi cũ).
  • Nếu người dùng gặp phải hồi quy do hành vi đã thay đổi, cách khắc phục thực sự rất nhỏ: đặt submodule.<name>.branchthành mastersẽ khôi phục hành vi cũ.

Lưu ý rằng, với Git 2.29 (Q4 2020), các thử nghiệm trong contrib/được điều chỉnh theo thay đổi gần đây thành fmt-merge-msg.

Xem cam kết b87528c (03/08/2020) bởi Emily Shaffer ( nasamuffin) .
(Merged bởi Junio C Hamano - gitster- trong phạm 83b8250 , ngày 10 tháng 8 2020)

Revert "contrib:: subtreeđiều chỉnh kiểm tra để thay đổi trong fmt-merge-msg"

Ký tên: Emily Shaffer

Trở lại trạng này cam kết 508fd8e8baf3e18ee40b2cf0b8899188a8506d07 .

Trong 6e6029a8 ( fmt-merge-msg: cho phép bỏ qua điểm đến hợp nhất một lần nữa), chúng tôi lấy lại hành vi nơi hợp nhất chống lại ' master', theo mặc định, không bao gồm " into 'master'" ở cuối thông báo hợp nhất. Bản sửa lỗi kiểm tra này không còn cần thiết nữa.

Cũng thế:

Với Git 2.29 (Q4 2020), hãy cập nhật các bài kiểm tra để loại bỏ từ ' master' khỏi chúng.

Xem cam kết f33f2d3 , cam kết b6211b8 (26 tháng 9 năm 2020) và cam kết 432f5e6 , cam kết 5a0c32b , cam kết 659288c (21 tháng 9 năm 2020) bởi Johannes Schindelin ( dscho) .
(Hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 58138d3 , ngày 05 tháng 10 năm 2020)

tests: tránh các biến thể của mastertên chi nhánh

Người ký hợp đồng: Johannes Schindelin

Thuật ngữ masternày có một lịch sử dày đặc, đóng vai trò như một lời nhắc nhở thường xuyên về sự bất công về chủng tộc. Dự án Git không muốn tiếp tục điều này và đã bắt đầu tránh nó.

Bộ thử nghiệm sử dụng các biến thể của tên này cho các nhánh khác với tên mặc định. Ngoài t3200, nơi chúng tôi vừa giải quyết vấn đề này trong cam kết trước, những phiên bản đó có thể được đổi tên theo cách tự động vì chúng không yêu cầu bất kỳ thay đổi nào bên ngoài tập lệnh thử nghiệm, vì vậy hãy làm điều đó.

Do các nhánh được chạm vào có rất ít (nếu có) liên quan đến nhánh mặc định, chúng tôi chọn sử dụng một sơ đồ đặt tên hoàn toàn riêng biệt: topic_<number>(không thể là topic-<number>do t5515 sử dụng test_oidmáy móc với thuật ngữ và máy móc đó sử dụng các biến shell bên trong, có tên không được chứa dấu gạch ngang).

Thủ thuật này được thực hiện bởi lệnh gọi sed (GNU) này:

$ sed -i 's/master\([a-z0-9]\)/topic_\1/g' t/t*.sh

Và, vẫn với Git 2.29:

Xem cam kết 538228e , cam kết a15ad5d (08 tháng 10 năm 2020) bởi Johannes Schindelin ( dscho) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 62564ba , ngày 08 tháng 10 năm 2020)

t1415: tránh sử dụng mainlàm tên giới thiệu

Người ký hợp đồng: Johannes Schindelin

Để chuẩn bị cho một loạt bản vá sẽ thay đổi dự phòng init.defaultBranchthành main, chúng ta hãy không sử dụng mainlàm tên tham chiếu trong tập lệnh thử nghiệm này.

Nếu không, ( người đàn ông ) muốn bắt những ref đó cũng sẽ bất ngờ bắt được .git for-each-ref ... | grep mainrefs/heads/main

Vì các ref được đề cập là worktree-local (tức là mỗi worktree có một worktree riêng, giống như vậy HEAD), và vì test case đã sử dụng worktree thứ cấp được gọi là " second", firstthay vào đó hãy sử dụng tên " " cho các refs đó.

Trong khi ở đó, hãy điều chỉnh tiêu đề thử nghiệm nói về "repo" khi chúng có nghĩa là "worktree".


14

Kể từ Git 2.28 (phát hành ngày 27 tháng 7 năm 2020), một tùy chọn cấu hình mới init.defaultBranchsẽ được giới thiệu để thay thế thuật ngữ mã hóa cứng master.

Mặc định vẫn để master!

Người dùng có thể ghi đè giá trị mặc định của biến cấu hình bằng:

$ git config --global init.defaultBranch main

Đọc chương git doc để biết thêm chi tiết. Giới thiệu init.defaultBranch


Vâng, đó là những gì tôi đã viết trong câu trả lời của mình trên cùng trang đó. stackoverflow.com/a/62983443/6309
VonC

Và đó là những gì tôi đã tweet, đề cập đến cùng một câu trả lời: twitter.com/VonC_/status/1284968817010016268
VonC
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.