branch - Mercurial:我可以重命名一個分支嗎?




dvcs (5)

我們現在有一個“鼓舞人心”的分支,“分期”似乎是一個更好的語義契合。 處理這個問題的好策略是什麼?


Answers

更新到stiging分支並創建一個新的分支。 然後關閉舊的分支。

綜上所述:

hg update stiging
hg branch staging
hg commit -m"Changing stiging branch to staging."
hg update stiging
hg commit --close-branch -m"This was a typo; use staging instead."
hg push --new-branch

製作一個名為“舞台”的新分支,並忘記其他......


如果你有它的變化集,那麼你將不得不使用帶有分支映射的轉換擴展名來重命名它。 然後,每個人都必須克隆新的回購或剝離舊的分支。


對於未來的讀者:通過延期續約,您可以創建一個與分支歷史相同的新分支,並將整個分支歷史記錄移至該分支,如下所示:

hg update -r "parents(min(branch('stiging')))"
hg branch staging
hg commit
hg rebase --source "min(branch('stiging'))" --dest staging

這假設stiging只有一個父母。 當然你可以直接使用明確的修訂版本號。

注1:如果分支stiging包括與其他分支合併,我認為這將保留它們,只要stagingstiging具有相同的父項。 但我肯定會仔細檢查。

注2:由於這會編輯歷史記錄,舊分支不會簡單地從克隆存儲庫中消失(請參閱rebase文檔)。 除非每個人都可以重新克隆,否則對於一個大群體來說,這可能不是一個很實際的解決方案

Note3 / Edit(禮貌@JasonRCoombs):現在phases在mercurial中是標準的, rebase會拒絕修改已經推送的變更集。 要么通過將階段更改為草稿(使用hg phases ),或者讓舊分支停留在原來的位置來製作一個正確命名的副本(例如,使用`hg rebase --keep')來欺騙它。


我的Bash腳本貢獻基於mmrobin的答案 。

它需要一些有用的參數來指定包括和排除,或者只檢查/刪除本地或遠程分支,而不是兩者。

#!/bin/bash

# exclude branches regex, configure as "(branch1|branch2|etc)$"
excludes_default="(master|next|ag/doc-updates)$"
excludes="__NOTHING__"
includes=
merged="--merged"
local=1
remote=1

while [ $# -gt 0 ]; do
  case "$1" in
  -i) shift; includes="$includes $1" ;;
  -e) shift; excludes="$1" ;;
  --no-local) local=0 ;;
  --no-remote) remote=0 ;;
  --all) merged= ;;
  *) echo "Unknown argument $1"; exit 1 ;;
  esac
  shift   # next option
done

if [ "$includes" == "" ]; then
  includes=".*"
else
  includes="($(echo $includes | sed -e 's/ /|/g'))"
fi

current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
if [ "$current_branch" != "master" ]; then
  echo "WARNING: You are on branch $current_branch, NOT master."
fi
echo -e "Fetching branches...\n"

git remote update --prune
remote_branches=$(git branch -r $merged | grep -v "/$current_branch$" | grep -v -E "$excludes" | grep -v -E "$excludes_default" | grep -E "$includes")
local_branches=$(git branch $merged | grep -v "$current_branch$" | grep -v -E "$excludes" | grep -v -E "$excludes_default" | grep -E "$includes")
if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
  echo "No existing branches have been merged into $current_branch."
else
  echo "This will remove the following branches:"
  if [ "$remote" == 1 -a -n "$remote_branches" ]; then
    echo "$remote_branches"
  fi
  if [ "$local" == 1 -a -n "$local_branches" ]; then
    echo "$local_branches"
  fi
  read -p "Continue? (y/n): " -n 1 choice
  echo
  if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
    if [ "$remote" == 1 ]; then
      remotes=$(git remote)
      # Remove remote branches
      for remote in $remotes
      do
        branches=$(echo "$remote_branches" | grep "$remote/" | sed "s/$remote\/\(.*\)/:\1 /g" | tr -d '\n')
        git push $remote $branches
      done
    fi

    if [ "$local" == 1 ]; then
      # Remove local branches
      locals=$(echo "$local_branches" | sed 's/origin\///g' | tr -d '\n')
      if [ -z "$locals" ]; then
        echo "No branches removed."
      else
        git branch -d $(echo "$locals" | tr -d '\n')
      fi
    fi
  fi
fi




mercurial branch dvcs