Якщо є сховище, до якого я маю 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
замість них :
у новіших версіях git.
Якщо ви просто хочете віддалено перейменувати гілки, не перейменовуючи при цьому жодних локальних гілок , це можна зробити за допомогою однієї команди:
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 : Це, в основному, це два 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) продовжить відстежувати походження / old_branch. І як тільки ви видалите віддалений old_branch, new_branch все одно буде відслідковувати походження / old_branch, хоча зараз ця гілка вже відсутня.
Звичайно. Просто перейменуйте гілку локально, натисніть нову гілку та натисніть на видалення старої.
Єдине справжнє питання полягає в тому, що інші користувачі репозиторію не будуть перейменовані локальними гілками відстеження.
"Перейменування" віддаленої гілки - це насправді двоетапний процес (не обов'язково впорядкований):
git push [space]:<old_name>
як пояснив ksrb );Я використовую TortoiseGit, і коли я вперше спробував видалити гілку через командний рядок, я зрозумів це:
$ git push origin :in
fatal: "origin" не схоже на сховище git
fatal: Не вдалося прочитати з віддаленого сховища.
Переконайтеся, що у вас є правильні права доступу та сховище існує.
Це, ймовірно, пов’язано з тим, що для учасників конкурсу не буде завантажений приватний ключ (який TortoiseGit автоматично завантажується в конкурс ). Більше того, я помітив, що команди TortoiseGit не мають origin
в них посилання (наприклад git.exe push --progress "my_project" interesting_local:interesting
).
Я також використовую Bitbucket і, як і інші веб-менеджери в режимі онлайн-git подібного роду (GitHub, GitLab), мені вдалося видалити віддалену гілку безпосередньо через їх інтерфейс (сторінку відділень):
Однак у TortoiseGit ви також можете видалити віддалені гілки за допомогою перегляду посилань :
Клацнувши правою кнопкою миші на віддаленій гілці (видалений список), з'явиться варіант Видалити віддалену гілку :
Після видалення старої віддаленої гілки я натиснув безпосередньо в нову віддалену гілку через TortoiseGit, просто ввівши нове ім'я у полі Remote: у вікні Push: ця гілка була автоматично створена та видима у Bitbucket .
Однак якщо ви все ще вважаєте за краще це робити вручну, точкою, яка ще не згадується в цій темі, є -u
= --set-upstream
.
У git push
документах - -u
це лише псевдонім --set-upstream
, тому команди у відповідях Sylvain ( -set-upstream new-branch
) та Shashank ( -u origin new_branch
) еквівалентні, оскільки віддалене посилання за замовчуванням до,origin
якщо раніше не було визначено жодного іншого ref:
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 використовують це для просування в новостворену віддалену гілку . Ключовий питання може бути пов'язано з Pageant , не маючи його завантаженні , коли я намагався 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
Я не знаю, це правильно чи неправильно, але я пересунув "стару назву" гілки на "нове ім'я" гілки, а потім видалив стару гілку повністю за допомогою наступних двох рядків:
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
.