GitリモートURLを変更した後、リモートが拒否されました(浅い更新は許可されません)


163

サーバーとローカルコンピューターの両方で作業しているGitバージョン管理下のプロジェクトがあります。元々はリモートの原点をローカルコンピュータとして設定していましたが、これをBitBucketに変更したいと思います。

サーバーでコマンドを使用しました

git remote set-url origin bitbucket_address

しかし、今私が自分のプロジェクトをプッシュしようとすると、エラーが発生します

 ! [remote rejected] master -> master (shallow update not allowed)

何が原因で、どうすれば修正できますか?


3
ローカルバージョンをどのようにクローンしましたか?git clone --depth
Sascha Wolf

少し前のことで、思い出せません。調べる方法はありますか?
rwolst 2015年

2
フォルダに名前の付いたファイルがあるはずshallowです.git
Sascha Wolf

はい、shallowファイルを表示できます。
rwolst 2015年

不足している履歴を破棄する(または書き換える)ソリューションについては、stackoverflow.com / a
50996201を

回答:


328

git clone --depth <number>ローカルバージョンのクローンを作成するために使用したようです。これにより、浅いクローンになります。このようなクローンの1つの制限は、それを新しいリポジトリにプッシュできないことです。

現在、2つのオプションがあります。

  1. あなたが現在の履歴や欠落している履歴を気にしない場合は、この質問を見てください
  2. 完全な履歴を保持したい場合は、読み続けてください。

それで、あなたはあなたの歴史を保持したいのですよね?つまり、リポジトリを浅くする必要があります。そのためには、古いリモコンをもう一度追加する必要があります。

git remote add old <path-to-old-remote>

その後、git fetchこの回答で提案されているように)古いリモートから残りの履歴をフェッチするために使用します。

git fetch --unshallow old

これで、新しいリモートリポジトリにpushできるようになります。


:クローンの許可を取り消した後、古いリモートを明らかに削除できます。


45
キックスタートプロジェクトのクローンを作成し、履歴全体が必要ない/必要ない場合はどうなりますか?それを避ける方法はありますか?
itamar 2015年

9
@itamarこれは、完全に有効な新しい質問の良い例のようです。参照用にこの質問にリンクできます。
Sascha Wolf

14
新しい質問として尋ねstackoverflow.com/questions/29748197/...
itamar

2
git fetch --unshallowrefspecを使用して、リポジトリ全体ではなく特定のブランチのみを許可しないことに注意してください。例:git fetch --unshallow origin refs/heads/mydeepbranch:refs/remotes/origin/mydeepbranch
2015年

5
まったく新しいレポを作成せずに、クローン元のレポより少し遅れているレポにプッシュする場合は、ローカル参照がリモート参照を含むのに十分な深さで十分です。だから、あなたorigin/masterがそれをしたoldrepo/masterときにあなたclone --depth 1の前の20コミットであり、それ以来17のローカルコミットをしたなら、あなたはそれをするのに十分でありgit fetch --depth 37 origin refs/heads/master:refs/remotes/origin/master(オフバイワンエラーの謝罪)、それからあなたは問題git push oldrepo masterなく行うことができます(git 1.9.0以降が必要な場合があります)。
2015年

27

リポジトリがoriginで、元のリポジトリがの場合upstream

git fetch --unshallow upstream

これは私にとってはうまくいき、トップ投票の回答よりも簡単です。
Maosheng Wang

11

浅い初期のコミット以降に追加した新しいコミットをそのままリポジトリに保持したい場合の別のオプションは、次のとおりです。このコミットをインタラクティブなリベースで修正します。

  • 最初の(ルート)コミットを含むインタラクティブなリベースを開始します

    git rebase --interactive --root
    
  • pick初期コミットのをに変更しedit、ファイルを保存して閉じます。

    1より深いレポのクローンを作成した場合は、それらすべてのコミットに対して同じことを行う必要がある場合があります。または、fixupインタラクティブなリベース中にこれらすべてを実行します。

  • このコミットを通常の浅いコミットに変換します

    git commit --amend --no-edit
    

    これにより、コミットIDも変更され、この最初のコミットに共著者として追加されます。

  • リベースを完了することを忘れないでください

    git rebase --continue
    

ありがとうございました!元のリポジトリが削除され、その浅いコピーしかない場合は、魅力のように機能しました。
Vitalii Dmitriev

9

新しいレポをそのままプッシュしたい場合は、これを試すことができます:

  • まずold git folder、現在のリポジトリからを削除し、sudo rm -rf .git
  • 次にgitを再度初期化します git init
  • 次に、新しいリモートリポジトリを追加します。 git remote add your-new-repo
  • それを押します。

古いものにプッシュする必要がないので、私はこれがより良い解決策であると思いました。時々これはボイラープレートで発生する可能性があります。
rnpd

これは基本的に、ここにある関連する質問からの回答です
Sascha Wolf

@NachPD他のソリューションが「古いものへのプッシュ」を必要とすると言うとき、私はあなたが何を意味するのかわかりません。プッシュではなくフェッチを意味しますか?それはプッシュを必要としないからです。
Sascha Wolf

0

--unshallowのフェッチが機能しない場合。ブランチに問題があるはずです。プッシュする前に次のコマンドで修正してください。

git filter-branch -- --all

安全上の懸念があるため、-unshallowを使用してのみこれを実行することはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.