2012-05-15 5 views
4

Пытался использовать то, что here, но это не решает вещей для меня.Как остановить нажатие на несколько удаленных ветвей в git? (aka, Как отключить удаленные ветви git?)

У меня есть местное репо в git, клонированное из удаленного репо, development. Я разворачиваю локально, чтобы поиграть с новой функцией в ветке с именем newBranchName и позвонить git push origin newBranchName, чтобы настроить новую ветку на удаленном репо.

Теперь, когда я пытаюсь нажать, git, похоже, толкает мою ветку newBranchName во все, что отслеживает и ветка старой ветви. Я хочу, чтобы это остановилось.

Вот расширенный образец того, что я имею в виду. Я собираюсь создать локальную ветвь, добавить файл, зафиксировать локально, а затем нажать на новую ветку на удаленном сервере. Все идет нормально.

[email protected] /path/to/working/dir (oldBranch) 
$ git branch testingStuff 

[email protected] /path/to/working/dir (oldBranch) 
$ git checkout testingStuff 
Switched to branch 'testingStuff' 

[email protected] /path/to/working/dir (testingStuff) 
$ vim test.txt 

[email protected] /path/to/working/dir (testingStuff) 
$ git add test.txt 

[email protected] /path/to/working/dir (testingStuff) 
$ git commit -a 
[testingStuff 11468d8] Testing git; can trash this branch. 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 test.txt 

[email protected] /path/to/working/dir (testingStuff) 
$ git push origin testingStuff 
Counting objects: 4, done. 
Delta compression using up to 2 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 299 bytes, done. 
Total 3 (delta 1), reused 0 (delta 0) 
To http://url/to/remote/repo.git 
* [new branch]  testingStuff -> testingStuff 

Теперь, я отредактирую файл test.txt, зафиксирую изменение и нажмите. Это меня смущает.

[email protected] /path/to/working/dir (testingStuff) 
$ vim test.txt 

[email protected] /path/to/working/dir (testingStuff) 
$ git commit -a 
[testingStuff 2be7063] more testing git 
1 files changed, 1 insertions(+), 0 deletions(-) 

[email protected] /path/to/working/dir (testingStuff) 
$ git push 
Counting objects: 5, done. 
Delta compression using up to 2 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 276 bytes, done. 
Total 3 (delta 1), reused 0 (delta 0) 
To http://url/to/remote/repo.git 
    11468d8..2be7063 testingStuff -> testingStuff 
! [rejected]  oldBranch -> remoteTrackedByOldBranch (non-fast-forward) 
error: failed to push some refs to 'http://url/to/remote/repo.git' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 

Я хочу продолжить нажатием на testingStuff удаленно, но хотят, чтобы остановить нажатием на remoteTrackedByOldBranch, когда я печатаю git push. Я не хочу удалять какую-либо ветку - кажется, ряд ответов на подобные вопросы предполагает удаление, а не отсутствие слежения. Я также не хочу знать, как нажать на конкретную ветвь, только явно называя ее в команде git push. Слишком много ошибок памяти с мышцами. Я хочу git push, чтобы нажать только на origin/testingStuff.

Я уже несговорчиво (слово, которое доказывает сам) убил мой .git/config, пытаясь выполнить это, и он все еще нажимает remoteTrackedByOldBranch.

EDIT: Вот что мой .git/конфигурационный файл выглядит как после выполнения выше:

[core] 
     repositoryformatversion = 0 
     filemode = false 
     bare = false 
     logallrefupdates = true 
     symlinks = false 
     ignorecase = true 
     hideDotFiles = dotGitOnly 
[remote "origin"] 
     fetch = +refs/heads/*:refs/remotes/origin/* 
     url = http://url/to/remote/repo.git 
[branch "master"] 
     remote = origin 
     merge = refs/heads/master 
[branch "oldBranch"] 
     remote = origin 
     merge = refs/heads/oldBranch 

ничего о testingStuff отрасли в там.

РЕДАКТИРОВАТЬ:git branch -avv выхода:

[email protected] /path/to/working/dir (testingStuff) 
$ git branch -avv 
    master         721aa61 initial setup 
    projectFork1       e132f5f Fixed Construction grid labels getting sliced. 
    projectFork2       1d20317 initial load 
    oldBranch        1d20317 initial load 
* testingStuff       192f622 Still testing 
    remotes/origin/HEAD     -> origin/master 
    remotes/origin/empty     ec1c694 initial setup 
    remotes/origin/joeUserFork1   771f43e Initial Load 
    remotes/origin/master     721aa61 initial setup 
    remotes/origin/projectFork1   e132f5f Fixed Construction grid labels getting sliced. 
    remotes/origin/oldBranch    1d20317 initial load 
    remotes/origin/joeUserFork2   dc605e8 What was sent initially. 
    remotes/origin/testingStuff   192f622 Still testing 
    remotes/origin/upload_master   0d8c440 Initial Load 

ответ

12

только нажать ветку вы на

По умолчанию, мерзавец будет толкать все ваши ветви отслеживания всякий раз, когда вы выдаете GIT толчок без аргументов. чтобы сделать его только толкать ветку вы на

git config push.default upstream # git 1.7.10 
git config push.default tracking # older vesions use "tracking" instead of "upstream" 

если вы хотите мерзавец всегда работать так - вы можете использовать --global переключатель или просто отредактировать файл ~/.gitconfig, чтобы удовлетворить.

прекратить отслеживание удаленных филиалов

конфигурации Git является просто файл. Довольно часто самый простой способ исследовать и исправлять вашу конфигурацию git - это просто открыть файл .git/config и отредактировать его.

e.g. если у вас есть раздел, как это в вашем .git файле/конфигурации:

[branch "develop"] 
    remote = origin 
    merge = refs/heads/develop 
    rebase = true 

и вы сделаете это:

[branch "develop"] 
    rebase = true 

ваш филиал nolonger отслеживает все. Вы также можете просто удалить весь раздел, и git будет действовать одинаково.

+0

Ну, это странная часть. В config у меня есть '[branch master]' и (в приведенном выше сценарии), '[branch oldBranch]', но ничего для 'testStuff', моя новая ветка. Я предполагаю, что ваш 'develop' должен представлять' testStuff' в моем сценарии выше. У меня нет 'rebase = true' там, но я предполагаю, что это просто особенность вашего рабочего процесса. Я вложу свой конфиг в свой вопрос. – ruffin

+0

'$ git config set push.default upstream' дает ' error: key не содержит раздел: set'. Я буду Google вокруг. – ruffin

+0

«set» был ошибкой - я предполагаю, что вы сразу нашли, например. [this] (http://help.github.com/set-your-user-name-email-and-github-token/) – AD7six

3

Отношение отслеживания с удаленным филиалом поддерживается в branch.<BRANCHNAME>.remote и branch.<BRANCHNAME>.merge конфигурации элементов, связанных с конкретной отраслью. Вы можете увидеть текущую конфигурацию, как это:

git config --get-regexp 'branch.remoteTRackedByOldBranch.*' 

И вы можете удалить конфигурацию, как это:

git config --remove-section branch.remoteTrackedByOldBranch 

[Обратите внимание, что это удалит все конфигурации, связанные с этим видом деятельности, но вряд ли есть что-то другое, кроме настроек remote и merge. Вы, очевидно, можете сделать то же самое, вручную редактируя файл .git/config.]

После этого изменения git push больше не должен пытаться перетащить эту ветку на удаленный.

+0

Даже после удаления всего, что находится во главе с [branch X] (master & oldBranch), я все равно получаю '! [reject] oldBranch -> remoteTrackedByOldBranch (неперемотка вперед) '. В какой момент обновляется конфиг? Я открыл новые термины для git (используя git с MINGW32 для Windows), и ничего не меняется. Первая команда 'git config --get-regexp 'branch.remoteTRackedByOldBranch. *'' Ничего не возвращает, fwiw. – ruffin

+0

Что делает 'git branch -avv' шоу? Кроме того, отвечает ли '.git/config' в вашем ответе текущее состояние конфигурации? Если нет, возможно, обновите его и добавьте вывод команды 'branch'. – larsks

+0

Подход «гипотетического сценария» и «реальная жизнь» немного осложняют результаты, но я опубликовал вывод '-avv' с небольшой очисткой имени. Конфигурация .git/config была изменена только для скрытия путей. – ruffin