簡體   English   中英

在git中簽出遠程分支

[英]checkout remote branch in git

我已經將/var/www/website為一個(非裸露的)倉庫,並且有我的裸露倉庫的更新后掛鈎:

#!/bin/sh

echo
echo "**** Pulling changes into Live [Hub's post-update hook]"
echo

cd /var/www/website || exit
unset GIT_DIR
git pull hub master

exec git-update-server-info

因為我想在推送后立即在網站上看到更改。

但是,如果我創建了遠程分支,可以在本地倉庫中使用它,然后在其中提交並推送更改,則在網站上看不到它們(我總是看到master)。

有什么辦法可以在遠程(非裸機)倉庫中進行結帳?

更新后掛鈎獲取所有已更新引用的名稱。 這些將是位置參數( $1$2等)。 您將必須決定如何處理每一個。

例如,這個有點愚蠢的更新后腳本:

#! /bin/sh

for ref do
    case $ref in
    refs/heads/*) echo "a branch ($ref) was updated";;
    refs/tags/*) echo "a tag ($ref) was updated";;
    *) echo "something I don't understand ($ref) was updated";;
    esac
done

只需打印出所有已更新內容的全名。

使其變得不那么愚蠢,假設我們要捕獲分支更新並對它們進行一些有用的操作。 將第一個回聲替換為更復雜的東西:

    refs/heads/*) branch_update $ref;;

當然,我們必須定義一個branch_update函數。 這是新的腳本(它仍然不執行任何操作,但是有明顯的位置可以執行某些操作):

#! /bin/sh

branch_update() {
    local shortname=${1#refs/heads/}
    echo "branch $shortname is being updated"
    case $shortname in
    master) echo "master is updated, do something";;
    work) echo "work branch is updated, do something else";;
    *) echo "it's not a magic branch, do nothing";;
    esac
}

for ref do
    case $ref in
    refs/heads/*) branch_update $ref;;
    refs/tags/*) echo "a tag ($ref) was updated";;
    *) echo "something I don't understand ($ref) was updated";;
    esac
done

順便說一句:問題的表達方式表明您不太像git中那樣。 :-)當您進行推送(從您自己的某個回購副本到​​其他一些副本,無論是否裸露)時,如果您改變觀點,您可能會發現結果更容易理解。 您可以先考慮“我在推動”,然后再想象遠程回購與其他演員一樣,讓我們​​給他起一個名字,稱他為“ Bob”,然后考慮一下Bob所看到的。 從Bob的角度來看,Bob認為不是“ Yekver在推東西”,而是:“我,Bob,是從那間Yekver家伙那里得到的東西,並將其放入我的倉庫中。我添加了標記refs / tags / v1。 1,我要進行一些提交,然后將它們放入我的refs / heads / master中,我還要進行一些提交,並將它們放入我的refs / heads / devel-xyz中。”

這里的關鍵概念是,就git而言, 一切都是本地的 從鮑勃的角度來看,鮑勃的回購是本地的。 有人叫Yekver可能有一個基於此的倉庫,但是Bob的副本是Bob的副本。 Bob通過Bob的本地存儲庫執行本地操作,當您在這些掛鈎腳本中工作時,您就是在“成為Bob”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM