私がgit://
アクセスするだけのリポジトリがある場合(通常はプッシュ+プルするだけです)、ローカルで行うのと同じ方法でそのリポジトリのブランチの名前を変更する方法はありますgit branch -m
か?
私がgit://
アクセスするだけのリポジトリがある場合(通常はプッシュ+プルするだけです)、ローカルで行うのと同じ方法でそのリポジトリのブランチの名前を変更する方法はありますgit branch -m
か?
回答:
必要な名前で新しいローカルブランチを作成し、それをリモートにプッシュして、古いリモートブランチを削除するだけです。
$ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name
次に、古いブランチ名を表示するには、リポジトリの各クライアントが次のようにする必要があります。
$ git fetch origin
$ git remote prune origin
注:古いブランチがメインブランチである場合は、メインブランチの設定を変更する必要があります。そうしないと、を実行すると $ git push origin :old-branch-name
、「現在のブランチの削除が禁止されています」というエラーが発生します。
git fetch origin --prune
(新しいブランチを効果的にフェッチし、リモートから参照を削除するため)。
-d
または--delete
代わりに使用できます:
。
ローカルブランチの名前を同時に変更せずに、リモートでブランチの名前を変更したいだけの場合は、次の1つのコマンドで実行できます。
git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>
私はこのスクリプト(git-rename-remote-branch)を作成しました。これは、上記を簡単に行うための便利なショートカットを提供します。
bash関数として:
git-rename-remote-branch(){
if [ $# -ne 3 ]; then
echo "Rationale : Rename a branch on the server without checking it out."
echo "Usage : $(basename $0) <remote> <old name> <new name>"
echo "Example : $(basename $0) origin master release"
exit 1
fi
git push $1 $1/$2:refs/heads/$3 :$2
}
@ksrbのコメントを統合するには:これは基本的に、1つのコマンドで2つのプッシュを実行します。最初git push <remote> <remote>/<old_name>:refs/heads/<new_name>
に古いリモートトラッキングブランチに基づいて新しいリモートブランチをプッシュし、次にgit push <remote> :<old_name>
古いリモートブランチを削除します。
git push <remote>/<old_name>:refs/heads/<new_name>
手段は、SRCとして古いリモートを使用して新しいリモートプッシュし、その後 git push [space]:<old_name>
の手段は、古いリモートを削除
refs/heads/name
ですか?name
最初のコマンドを作成して直接使用することはできませんgit push <remote> <remote>/<old_name>:<new_name>
か?
<new_name>
はまだ存在しないためです。ブランチが存在しない場合、Gitは<new_name>
タグ名を参照する可能性があるため、フルネームを使用するように要求します。
refs/heads/<new_name>
すでに存在する場合です。削除は引き続き成功し、削除<remote>/<old_name>
のみが行われます。事前に確認すると、これを簡単に回避できます。
名前を変更するブランチへの最初のチェックアウト:
git branch -m old_branch new_branch
git push -u origin new_branch
から古いブランチを削除するにはremote
:
git push origin :old_branch
git push -u origin new_branch
:)で追跡するように設定する必要があります。そうしないと、名前を変更したブランチ(new_branch)がorigin / old_branchを追跡し続けます。また、リモートold_branchを削除しても、new_branchは引き続きorigin / old_branchを追跡しますが、ブランチはなくなっています。
承知しました。ローカルでブランチの名前を変更し、新しいブランチをプッシュし、古いブランチを削除するだけです。
唯一の本当の問題は、リポジトリの他のユーザーがローカルトラッキングブランチの名前を変更できないことです。
リモートブランチの「名前の変更」は、実際には2ステップのプロセスです(必ずしも順序付けはされていません)。
git push [space]:<old_name>
としてksrbについて説明)。私はTortoiseGitを使用していて、最初にコマンドラインからブランチを削除しようとしたときに、次のようになりました。
$ git push origin :in
致命的: 'origin'はgitリポジトリではないようです
致命的:リモートリポジトリから読み取れませんでした。
正しいアクセス権があり、リポジトリが存在することを確認してください。
これは、ページェントにプライベートキーがロードされていないことが原因である可能性があります(TortoiseGitがページェントに自動的にロードします)。さらに、TortoiseGitコマンドにはorigin
参照が含まれていないことに気づきました(例:)git.exe push --progress "my_project" interesting_local:interesting
。
私はBitbucketも使用しています。他の種類のWebベースのオンラインgitマネージャー(GitHub、GitLab)として、リモートブランチをインターフェース(ブランチページ)から直接削除することができました。
ただし、TortoiseGitでは、参照の参照を通じてリモートブランチを削除することもできます。
リモートブランチ(リモートリスト)を右クリックすると、[リモートブランチの削除]オプションが表示されます。
古いリモートブランチを削除した後、PushウィンドウのRemote:フィールドに新しい名前を入力するだけでTortoiseGitを介して新しいリモートブランチに直接プッシュしました。このブランチは自動的に作成され、Bitbucketに表示されました。
ただし、それでも手動で実行したい場合、このスレッドでまだ言及されていない点は、-u
= --set-upstream
です。
git push
ドキュメント、-u
のちょうどエイリアスである--set-upstream
のでの回答のコマンドのSylvain( -set-upstream new-branch
)とShashankは(-u origin new_branch
)リモートREFのため、等価なデフォルトorigin
他の参考文献は、以前に定義されていない場合。
git push origin -u new_branch
= ドキュメントの説明git push -u new_branch
から:
構成が欠落している場合、デフォルトでになり
origin
ます。
結局、ここで他の回答によって提案されたコマンドを手動で入力したり使用したりしなかったので、おそらくこれは同じような状況の他の人にとって役立つかもしれません。
origin
です。コマンドを実行して得られるように、リモコンに名前を付ける必要がありますgit remote
。Git ssh
は、公開鍵と秘密鍵を使用していることを意味するものと連携します。私がいることを前提とAutoload Putty keys
TortoiseGitのは自分のリモート参照を使用して、すべてで何かをするあなたのために必要なキーを自動ロードされます。最後にgit push -u
、これはリモートブランチにプッシュするためのエイリアスではなく、ローカルに作成されたリモートブランチにプッシュするためのエイリアスであり、そのリモート参照にはまだこのブランチがありません。
-u
エイリアスで--set-upstream
あり、「設定が欠落している場合origin
、デフォルトで "になります。SylvainとShashankはこれを使用して、新しく作成されたリモートブランチにプッシュします。キー問題はする予定だったかもしれページェント私が試したときに、それがロードされて持っていないgit push origin :in
シェル上で。だから私はあなたの反対票を理解していません、私は他の回答で私のものと扱われていない詳細を指摘し、それらを説明して解決しました。
-u
エイリアスです--set-upstream
が、あなたが言ったようにリモートブランチにプッシュするためのエイリアスではありません。一意に必要なリモートブランチにプッシュするには、git push <remote>
それがまだリモートにない場合は、を追加しgit push -u <remote>
ます。したがって、-u
リモートでブランチの参照を作成するために使用されます。
理由はわかりませんが、@ Sylvain Defresneの回答ではうまくいきません。
git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name
アップストリームの設定を解除する必要があるので、ストリームを再度設定できます。以下は私がそれをした方法です。
git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name
これが正しいか間違っているかはわかりませんが、ブランチの「古い名前」をブランチの「新しい名前」にプッシュし、次の2行で古いブランチを完全に削除しました。
git push origin old_branch:new_branch
git push origin :old_branch
すでに与えられた答えに加えて、これは最初に新しいブランチがすでに存在するかどうかをチェックするバージョンです(そのため、スクリプトで安全に使用できます)。
if git ls-remote --heads "$remote" \
| cut -f2 \
| sed 's:refs/heads/::' \
| grep -q ^"$newname"$; then
echo "Error: $newname already exists"
exit 1
fi
git push "$oldname" "$remote/$oldname:refs/heads/$newname" ":$oldname"
(チェックはこの答えからです)
git show-ref --quiet --verify -- refs/heads/$new_name
代わりに使用したでしょうls-remote | cut | sed | grep
。
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
。