Git: Cách chính xác để thay đổi Active Branch trong kho lưu trữ trống?


195

Tôi có một kho lưu trữ trần được sử dụng làm cửa hàng trung tâm cho dự án của tôi. Tất cả các nhà phát triển làm git clone <repo>để chia sẻ với nó. Khi họ thực hiện bản sao, họ sẽ kiểm tra nhánh chính (trừ khi họ làm git clone -n) vì repo.git/HEADcó chứa ref: refs/heads/master, biến đây thành Nhánh hoạt động .

Câu hỏi là, làm cách nào để thay đổi Active Branch đúng cách? Tôi chỉ đơn giản là có thể hack repo.git/HEADtệp trực tiếp, nhưng điều đó có vẻ khó chịu và, tốt, hacky.

Tôi đã thử làm git checkout <otherbranch>trong .gitthư mục repo , nhưng thất bại vì tôi không ở trong cây làm việc.

Tôi đã thử git update-ref HEAD refs/heads/otherbranchnhưng chỉ cập nhật ref / Heads / master giống như refs / Heads / otherbranch (được thôi, tôi đã làm cái đó trong kho lưu trữ giả, không phải sản phẩm của tôi!)

Tôi đã thử git update-ref --no-deref HEAD refs/heads/otherbranchvà điều đó gần như đã làm việc. Nó cập nhậtHEAD tệp, nhưng nó đặt nó vào SHA1 của cam kết được trỏ tới refs/heads/otherbranch.

Tôi đang thử nghiệm với phiên bản git 1.7.0.2.msysgit.0 .

Tôi đoán không có cách nào để thực hiện điều này git push, vì cho phép tất cả và lặt vặt thay đổi nhánh mặc định của bạn có vẻ hơi không an toàn (!), Nhưng chắc chắn có cách tốt hơn để làm điều đó trong .gitthư mục repo hơn là trực tiếp hack HEADtệp.


IMO về cơ bản bạn đang cố gắng thực hiện Điều sai ở đây. Nếu bạn muốn nhánh mặc định là một cái gì đó không phải là master, thì nhánh đó cần phải là master. Ngoài ra, sử dụng hai kho khác nhau.
Hiệp sĩ Nicholas

12
Làm thế nào điều này về cơ bản là cố gắng làm điều sai ở đây? Một kho lưu trữ trần hỗ trợ nhiều chi nhánh. Tôi sử dụng một kho lưu trữ trần để sao lưu vào kho lưu trữ cục bộ của mình và như vậy phản chiếu các nhánh. Tôi có một bậc thầy về cả hai và một nhánh phát triển trên cả hai. Nếu tôi muốn xem nhật ký của nhánh phát triển trên kho lưu trữ trần, tôi phải hack các tệp - có vẻ như git sai về cơ bản ở đây liên quan đến hỗ trợ kho lưu trữ trần.
Cthutu

15
@NicholasKnight IMHO bạn sai về cơ bản ở đây. Không có gì đặc biệt về "chủ" như một tên chi nhánh, nó chỉ là mặc định. Trong các kho lưu trữ duy trì, chúng tôi không có chi nhánh chính, vì "chủ" không có ý nghĩa đối với công ty. Bất cứ khi nào chúng tôi thực hiện một bản phát hành, chúng tôi sẽ tạo một nhánh bảo trì mới với số bản phát hành mới và gán nó làm nhánh hoạt động.
Spacemoose

@NicholasKnight Mặc dù tôi đánh giá cao nơi bạn đến, nhưng đây là câu hỏi đầu tiên về SO đã cho tôi biết làm thế nào để chuyển sang làm chủ! Tôi đã có repo ban đầu của mình trên một nhánh tính năng khi tôi tạo bản sao trần của mình và các bản sao tiếp theo từ repo trần đó được mặc định cho nhánh đó thay vì chủ.
Warbo

1
Wow - câu hỏi này chỉ chạy và chạy - đó là người ghi điểm danh tiếng số 1 của tôi! Vấn đề của "bậc thầy" là nó chỉ là một cái tên và nếu nó không có ý nghĩa đối với tổ chức, nhóm, dự án, giai đoạn của bạn, thì hãy chọn thứ gì đó phù hợp để khi cộng tác viên sao chép repo của bạn, họ sẽ ngay lập tức chuyển đổi đến nhánh mà bạn, với tư cách là Trình quản lý cấu hình, muốn chúng được bật. Tôi đã từng làm việc với ClearCase (bletch!) Vì vậy các lựa chọn của bạn là "chính", "chính" hoặc "chính". Yuk.
kbro

Câu trả lời:


279

Nếu bạn có quyền truy cập vào repo trần từ xa, bài viết này gợi ý :

git symbolic-ref HEAD refs/heads/mybranch

Cái nào sẽ cập nhật tệp CHÍNH trong kho lưu trữ của bạn để nó chứa:

ref: refs/heads/mybranch

như tài liệu trong git-symbolic-ref


Nếu bạn không có quyền truy cập vào repo từ xa, hãy xem câu trả lời trước của tôi .


Hãy nhớ rằng một lệnh như git remote set-head:

  • không thay đổi nhánh mặc định của repo từ xa .
    Nó chỉ thay đổi một nhánh theo dõi từ xa được lưu trữ trong repo cục bộ của bạn nhưrefs/remotes/<name>/HEAD

  • không thay đổi HEADchính nó (một lần nữa, chỉ refs/remotes/<name>/HEAD), do đó cần git symbolic-ref.

Vì vậy, git remote set-head không phải là câu trả lời ở đây.
git symbolic-ref HEADlà, nếu bạn có quyền truy cập trực tiếp vào repo từ xa.


3
Cảm ơn! Tôi có quyền truy cập trực tiếp vào repo trần từ xa để git-Symbolic-ref sẽ thực hiện công việc. Tôi thích thủ thuật không có tổ tiên chung được đề cập trên các chủ đề khác, mặc dù vậy - chắc chắn là một cho ngăn kéo dưới cùng. Tôi đã dành nhiều thời gian để làm điều này nhưng không thể tìm thấy câu trả lời trước đó của bạn, nhưng "git remote head master" nhận thấy đây là lần truy cập được xếp hạng cao thứ hai, ngay dưới git-remote (1). Kỳ quái. Chỉ cần đi để cho thấy thật khó để tìm thấy một cái gì đó khi bạn không biết chính xác những gì bạn đang tìm kiếm.
kbro

git symbolic-ref HEAD refs/heads/mybranchlàm việc tốt cho tôi CẢM ƠN! ;)
vinzenzweber

1
Tôi thực sự đánh giá cao câu hỏi này, vì tôi đã vô tình kiểm tra một chi nhánh khác với chủ và bây giờ tôi phải sửa nó.
Jonny hay nhất

Điều này không làm việc cho tôi. Điều kỳ lạ là, mặc dù ĐẦU từ xa trong repo trần hiện hiển thị nhánh chính xác, git VẪN mặc định tôi đến một nhánh khác khi tôi sao chép từ nó!
Magnus

@Magnus đó sẽ là một câu hỏi hay của riêng nó để hỏi trong một trang mới.
VonC

3

Để thay đổi nhánh, bạn cần thay đổi tham chiếu CHÍNH thành nhánh bạn muốn sử dụng.

Đầu tiên liệt kê tất cả các tài liệu tham khảo trong kho lưu trữ trần bằng cách làm

$find ref

Sau đó tìm tham chiếu cho chi nhánh của bạn, định dạng sẽ như sau refs/heads/<my_branch>. Vì vậy, bước tiếp theo là kiểm tra tham chiếu hiện tại, chỉ cần gõ:

$git symbolic-ref HEAD

Vì vậy, bạn biết đó là chi nhánh hiện tại sau đó cập nhật nó khi cần thiết.

$git sumbolic-ref HEAD ref/heads/<my_branch>

Đó là nó. Thưởng thức.


2

Làm thế nào để thay đổi Active Branch đúng cách?

  • status: git checkout trong thư mục repo .git trả về fatal: Thao tác này phải được chạy trong cây làm việc

  • mẹo: chỉ cần thêm đối số --work-tree

ví dụ chi tiết: giả định: git trần trên máy chủ từ xa:

~ / Bare_git_Vposeective.git tách rời cây làm việc: / var / www / myappremote

trên máy chủ cục bộ: tạo phiên bản chi nhánh.1.7 (otherbranch của chúng tôi)

phiên bản chi nhánh git.1.7

git đẩy phiên bản gốc.1.7

trên máy chủ từ xa với git trần repo:

$ cd ~ / Bare_git_Vposeective.git

chi nhánh $ git

  • chủ
    version.1.7

Như đã nêu, lệnh sau

phiên bản kiểm tra git.1.7

trở về

gây tử vong: Hoạt động này phải được chạy trong một cây làm việc

Sử dụng lệnh sau

git --work-tree = / var / www / myappremote phiên bản kiểm tra.1.7

thay đổi thành công Chi nhánh hoạt động

chi nhánh $ git

bậc thầy

  • phiên bản.1.7

kiểm tra kết quả như sau

ll / var / www / myappremote

hy vọng nó sẽ giúp


Giải pháp rất đơn giản này đã làm việc cho tôi, cảm ơn! Một lưu ý: Tôi phải tạo một thư mục cây công việc trống bằng tay để lệnh thực thi thành công.
Joël Esponde

-1

Ngoài ra, nếu bạn không có quyền truy cập vào kho lưu trữ trống, bằng cách thực hiện git remote set-head và bạn đã hoàn tất

Xem phản hồi trước đó


-3

Tôi cũng có một repo trần trên máy chủ của chúng tôi và có thể truy xuất thành công các tệp bằng cách sử dụng

git clone //server/repo/directory -b branch_name

vào một kho lưu trữ cục bộ mới mặc dù trang này cho biết đây chỉ dành cho các kho lưu trữ không trống.


1
Mặc dù những gì bạn nói là đúng, nhưng thực tế là bạn đang sử dụng -b để chọn một nhánh cụ thể sẽ phá vỡ câu trả lời của bạn trong bối cảnh câu hỏi của tôi, đó là cách bạn đặt nhánh DEFAULT.
kbro

-4

Tôi đã so sánh hai thư mục trước và sau khi áp dụng

git symbolic-ref HEAD refs/heads/mybranch

và có vẻ như chỉ có tệp repo.git / HEAD được thay đổi nên có lẽ nó khá an toàn chỉ để "hack" tệp.


2
Có những vấn đề vi phạm tinh vi có thể được giới thiệu bằng cách chỉnh sửa trực tiếp các tệp Git ref. Tôi rất khuyến khích chống lại điều đó. Các lệnh hệ thống ống nước dễ dàng và an toàn hơn so với chỉnh sửa trực tiếp.
Alain O'Dea

2
Lợi thế của @boryn này là gì?
Alex Chamberlain

2
Git theo dõi rất nhiều thứ trong nền như lịch sử của refs. Nếu bạn thay đổi tập tin theo cách thủ công thì nó sẽ không được đăng nhập. Đúng là nó có lẽ sẽ không thành vấn đề. Nhưng nếu bạn mất dấu vết của một số cam kết và muốn tìm thấy chúng, bạn sẽ hạnh phúc hơn nếu bạn không "hack" tệp.
qwerty9967

Tôi đã sử dụng lệnh. Nhưng câu trả lời này rất hữu ích để hiểu cách thức hoạt động của nó, và, trong phần chính, để hiểu rằng ref / head là một cái gì đó bên trong và tôi không nên thay đổi nó, chỉ là phần cuối của "con đường". Vì vậy, tôi đã bỏ phiếu vì tôi nghĩ đó là thông tin có giá trị.
Mike Keskinov
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.