Có cách nào tốt hơn để tìm hiểu xem một nhánh git địa phương có tồn tại không?


191

Tôi đang sử dụng lệnh sau để tìm hiểu xem một nhánh git cục bộbranch-nametồn tại trong kho lưu trữ của tôi không. Điều này có đúng không? Có cách nào tốt hơn?

Xin lưu ý rằng tôi đang làm điều này trong một kịch bản. Vì lý do này, tôi muốn sử dụng các lệnh hệ thống ống nước nếu có thể.

git show-ref --verify --quiet refs/heads/<branch-name>
# $? == 0 means local branch with <branch-name> exists. 

Lệnh của bạn trông giống như lệnh tôi đã sử dụng.
Paŭlo Ebermann

6
Trong sự thiếu hiểu biết của tôi, tôi đã đi với git branch | grep -w <branch-name>. Ok, đó là một lệnh bằng sứ, nhưng tôi không thể tưởng tượng cách sử dụng cụ thể này sẽ thay đổi đáng kể trong tương lai để làm cho đoạn trích này không thể sử dụng được ...
ChúZeiv

@UncleZeiv: Bạn có thể đúng rằng lệnh sẽ không thay đổi đáng kể để làm cho nó không sử dụng được. Tôi có một chút OCD về những thứ như sứ so với hệ thống ống nước, chỉ vậy thôi.
Manoj Govindan

9
git rev-parse --verify <branch_name>cũng xác minh các tham chiếu khác như thẻ và cam kết băm, vì vậy mặc dù nó có thể phù hợp hơn với những gì bạn cần, nó sẽ trả về dương tính giả nếu bạn chỉ quan tâm chính xác đến các nhánh.
Paul S.

2
Chỉ git show-ref đang hoạt động để xác định xem một nhánh ĐỊA PHƯƠNG có mặt hay không. Trong bản cập nhật (cú pháp với git rev-parse), mã trả về cũng là 0 nếu một nhánh từ xa khớp.
Fabien Bouleau

Câu trả lời:


57

Theo như tôi biết, đó là cách tốt nhất để thực hiện nó trong một kịch bản. Tôi không chắc có nhiều hơn để thêm vào đó, nhưng cũng có thể có một câu trả lời chỉ nói rằng "Lệnh đó làm mọi thứ bạn muốn" :)

Điều duy nhất bạn có thể muốn cẩn thận là tên chi nhánh có thể có các ký tự đáng ngạc nhiên trong đó, vì vậy bạn có thể muốn trích dẫn <branch-name>.


1
điểm tốt về trích dẫn <branch-name>. FWIW Tôi đang sử dụng điều này trong một kịch bản vải. Tôi sẽ nhớ trích dẫn biến.
Manoj Govindan

Câu trả lời đúng là ngầm định: git show-ref --verify --quiet refs / Heads / <Branch-name> sẽ cho thấy rằng HEAD không phải là một nhánh chính xác. git rev-parse --verify sẽ cho bạn biết CHÍNH là một nhánh hiện có. Sai vì CHÍNH không phải là một nhánh.
Paulo Neves

106

Khi tôi tìm kiếm 'git check nếu chi nhánh tồn tại' trên công cụ tìm kiếm, trang này là trang đầu tiên tôi nhìn thấy.

Tôi nhận được những gì tôi muốn, nhưng tôi muốn cung cấp một câu trả lời cập nhật vì bài viết gốc là từ năm 2011.

git rev-parse --verify <branch_name>

Điều này về cơ bản giống như câu trả lời được chấp nhận, nhưng bạn không cần gõ "refs / Heads /"


20
Chỉ cần một lưu ý: git rev-parse --verifychỉ cho bạn biết nếu một đối tượng như vậy tồn tại trong repo (tức là nó sẽ trả về 0 cho bất kỳ giá trị <branch_name>nào chuyển thành một đối tượng thuộc bất kỳ loại nào trong repo). Nó không cho bạn biết nếu đối tượng đó là một nhánh hay không.
tavnab

9
Đây không phải là một câu trả lời chính xác cho câu hỏi, đó là hỏi làm thế nào để biết nếu một chi nhánh tồn tại. Điều này sẽ cung cấp cho bạn một dương tính giả cho một thẻ. Bạn có thể dễ dàng kiểm tra điều này cho mình. Bạn cần refs / Heads / để phân biệt với các thẻ nằm trong refs / tags và thậm chí từ xa trong refs / điều khiển từ xa.
msouth

15
git rev-parse --verify gh-page mang lại cho tôi: fatal: Cần một phiên bản duy nhất
SuperUberDuper

@SuperUberDuper bạn đã thử: git rev-parse --verify ** origin / ** gh-page?
RoyalBigMack

33

Gần đến rồi.

Chỉ cần bỏ qua --verify--quietvà bạn nhận được một trong hai băm nếu chi nhánh tồn tại hoặc không có gì nếu nó không.

Gán nó cho một biến và kiểm tra một chuỗi rỗng.

exists=`git show-ref refs/heads/<branch-name>`
if [ -n "$exists" ]; then
    echo 'branch exists!'
fi

10
Giá trị trả về là đủ - bạn không cần phải trải qua nỗ lực dễ bị lỗi khi gán cho một biến.
msouth

15

Tôi nghĩ bạn có thể sử dụng git show-branchở đây.

$ git show-branch --list
  [master] test
* [testbranch] test
$ git show-branch testbranch
[testbranch] test
$ echo $?
0
$ git show-branch nonexistantbranch
fatal: bad sha1 reference nonexistantbranch
$ echo $?
128

Vậy, $? == 0 sẽ chỉ ra rằng chi nhánh tồn tại và bạn không cần phải đào sâu vào hệ thống ống nước của refs / Heads /. Miễn là bạn không vượt qua -rđể hiển thị chi nhánh, nó sẽ chỉ hoạt động trên các chi nhánh địa phương.


5
AFAIK git show-branchlà một lệnh sứ . Như tôi đã nói trong câu hỏi của mình, tôi không muốn sử dụng các lệnh bằng sứ trong một kịch bản nếu có sẵn hệ thống ống nước. Xem kernel.org/pub/software/scm/git/docs
Manoj Govindan

3
@Manoj: Tôi biết về đồ sứ so với hệ thống ống nước, nhưng tôi chưa bao giờ đọc rằng hệ thống ống nước được coi là ổn định hơn đồ sứ. Cảm ơn đã chỉ cho tôi điều đó trong các tài liệu.
Đánh dấu Drago

Để tránh việc tìm thẻ nhầm, và cụ thể hơn về việc chi nhánh là cục bộ hay từ xa, bạn có thể chỉ định git show-branch refs/heads/[branch]hoặc git show-branch refs/remotes/origin/[branch].
twasbrillig 16/03/18

13

Tôi đề nghị git show-ref --quiet refs/heads/$name.

  • --quiet có nghĩa là không có đầu ra, điều này là tốt bởi vì sau đó bạn có thể kiểm tra sạch trạng thái thoát.

  • refs/heads/$namegiới hạn cho các chi nhánh địa phương và khớp tên đầy đủ (nếu không devsẽ khớp develop)

Cách sử dụng trong tập lệnh:

if git show-ref --quiet refs/heads/develop; then
    echo develop branch exists
fi

Yup đây là người duy nhất làm điều đó âm thầm. Việc đặt tên của lệnh git là một chút wack tbh
smac89

10

Để sử dụng trong một tập lệnh:

git show-ref -q --heads <branch-name>

Điều này sẽ thoát 0nếu và chỉ khi <branch-name>tồn tại như một nhánh cục bộ.

Thí dụ:

if git show-ref -q --heads <branch-name>; then
   echo 'Branch exists'
fi

2

Trên kịch bản lô windows, nó hơi khác một chút,

git rev-parse --verify <branch>

if %ERRORLEVEL% == 0  (
    echo "Yes"
) else (
    echo "No"
)


1

Hãy gọi nó git is_localbranch(bạn cần thêm bí danh .gitconfig).

Sử dụng:

$ git is_localbranch BRANCH

Nguồn:

git branch | grep -w $1 > /dev/null
if [ $? = 0 ]
then
  echo "branch exists"
fi

1

Kết quả của việc xem xét 'Chỉnh sửa được đề xuất' của tôi đối với 'Cập nhật' cho câu hỏi ban đầu là 'Nó nên được viết dưới dạng nhận xét hoặc câu trả lời', vì vậy tôi sẽ đăng nó ở đây:

Một cách khác được đề xuất sẽ không chỉ xác minh các chi nhánh mà bất kỳ tham chiếu nào có tên như vậy @jhuynh .

git rev-parse --verify <reference-name>
# $? == 0 means reference with <reference-name> exists.

Vấn đề với một 'Cập nhật' về câu hỏi ban đầu được giải thích:

Giả sử và kiểm tra xem 'master.000' chỉ là một thẻ, nhánh cục bộ đó không tồn tại, grep trả về một mục nhập wchich là một thẻ. Vẫn phân tích lại sẽ trả về 0 nếu tham chiếu tồn tại, ngay cả khi nhánh cục bộ đó không tồn tại. Đây là một trận đấu sai, chính xác như được đề cập bởi @ paul-s

$ git show-ref |grep master.000

f0686b8c16401be87e72f9466083d29295b86f4a refs/tags/master.000
$ git rev-parse --verify master.000
f0686b8c16401be87e72f9466083d29295b86f4a
$ echo $?
0


0

Không git show-refphải cũng không git rev-parselàm việc trên trường hợp của tôi.

$ git --version
git version 2.21.0

$ git show-branch --list
* [master] mybranch commit

$ BRANCH_NAME=mybranch
$ git rev-parse --verify $BRANCH_NAME
fatal: Needed a single revision

$ git show-ref refs/heads/$BRANCH_NAME
<no otput>
$ [ $? == 0 ] && echo "$BRANCH_NAME exists" || echo "$BRANCH_NAME not exists"
mybranch not exists

Tôi đã kết thúc với điều này

$ BRANCH_NAME=mybranch
$ SHOW_ALL=`git show-branch --all | grep -w $BRANCH_NAME`
$ [ $? == 0 ] && echo "$BRANCH_NAME exists" || echo "$BRANCH_NAME not exists"
mybranch exists

Bạn cũng có thể làm với một tập tin kịch bản

#!/bin/sh
BRANCH_NAME=mybranch
if grep -Fqe $BRANCH_NAME << EOF
`git show-branch --all`
EOF
then
   echo "$BRANCH_NAME exists"
else
   echo "$BRANCH_NAME not exists"
fi

-1

Nếu bạn có thể quản lý để bao gồm grep.

git branch | grep -q <branch>

1
Điều đó có thể cung cấp cho bạn câu trả lời sai nếu bạn sử dụng dấu chấm (".") Trong tên nhánh, như tôi đôi khi làm, vì dấu chấm được hiểu greplà một metacharacter.
Peter John Acklam

1
Bạn cũng sẽ nhận được kết quả dương tính giả nếu bạn kiểm tra một nhánh có tên là một chuỗi con của một nhánh thực sự. ví dụ abcsẽ khớp nếu có một nhánh gọi là abcdef.
rjmunro

-1

Để sử dụng trong tập lệnh, tôi khuyên dùng lệnh sau:

git ls-remote --heads <repo_url> "<branch_name>" | wc -l

Lưu ý rằng <repo_url>chỉ có thể là "." để chỉ định repo cục bộ nếu bạn ở trong cấu trúc thư mục của nó, đường dẫn đến repo cục bộ hoặc địa chỉ của repo từ xa.

Lệnh trả về 0 nếu <branch_name>không có mặt 1 nếu có.


-1
git branch --list $branch_name | grep $branch_name

sau đó kiểm tra giá trị trả về là 0 hoặc 1.

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.