2013-08-23 9 views
14

私はlinuxからbitbuckedにプロジェクトをプッシュし、それをウィンドウにクローンしました。ウィンドウにテキストファイルとして現れる2つのシンボリックリンクがあったことが分かります。私は彼らがどこに指し示すべきかを知っていたので、コミットされプッシュされた目的地ファイルのコピーでそれらを置き換えました。Git:シンボリックリンクを作成できません(ファイル名が長すぎます)

今、butbucketリポジトリは、ウェブインタフェースから見ても大丈夫です。

error: unable to create symlink ... (File name too long) 

とシンボリックリンクが以前に存在しないされた2つのファイル:しかし、私のUNIXマシン上のgitのクローンは私のような2つのメッセージを与えます。私は短いファイル名を得るために/ tmp/...に複製を試みましたが、同じ結果が得られました。つまり、bitbucketリポジトリで何かがうまくいかないことが示唆されています。私はcore.symlinksのオンとオフを試しました。

私はシンボリックリンクなしで暮らすことができますが、私は作業リポジトリを持っていたいと思います。誰かが(リポジトリを再作成する以外の)方法を知っていますか?

答えて

12

symlinkから通常のファイルにモードを変更せずに偽のsymlink-fileの内容を変更し、結果をコミットすると、実際のシンボリックリンクを持つOS上では抽出できないBLOBを作成し、シンボリックリンクと思われるオブジェクトがありますが、内容が長すぎてパス名にはならないためです。この問題を隠すことによって、Webインターフェイスはあなたに何の恩恵も与えていません。

おそらく、そのコミットにバックアップして修正し、その後すべてを再コミットする必要があります。 git rebase -iが助けになりますが、これはまだ簡単ではないかもしれません。特に、シンボリックなシンボリックリンクだが実際にはシンボリックリンクの状態になっている間にファイルをもっと変更した場合は特にそうかもしれません。悪いコミット仮に

abcdef123で、あなたはこれを実行する必要があります。

git rebase -i 'abcdef123^' 

コミットのリストをエディタであなたを置くであろう。 abcdef123が最初の行に表示されます。その行でpickeditに変更します。複数の不良コミットがある場合は、すべてをeditに変更します。保存してエディタを終了します。

これで、不正なファイルをコミットした時点に戻ります。これは歴史を変えて、間違っていたことを正しいものにするチャンスです。

git show 

にコミットし、それをINGのファイルとgit addにオリジナルのシンボリックリンクのパス名を復元することによって、悪い部分を元に戻す点検。あるいは、実際にはgit rmでsymlinkを適切に削除してから、新しいファイルを作成してgit addとすることができます。最初のオプションを選択した場合、シンボリックリンクの内容は単なるパス名であることに注意してください。これはテキストファイルではありません。最後に改行がありません。改行を追加するテキストエディタで編集すると、シンボリックリンクが壊れてしまいます(名前に改行を含むファイルを指す)。

あなたgit addをやった後、一定の歴史の中でその場所にコミットを再挿入:

git commit --amend 
git rebase --continue 

あなたはpickからeditに複数のコミットを変更した場合は、それぞれに対して、その手順を繰り返す必要があります。最終的にgit rebase --continueはあなたを現在に戻します。

リベース中に過去にコミットしていて、コミット全体が悪い(それが指しているファイルの変更されていない内容でシンボリックリンクを置き換える以外に何もしなかった)場合は、git rebase --skip修正し続ける。これが起こることを前もって知っている場合は、git rebase -iリストから悪いコミットを削除してpickeditに変更することができます。

不良コミットの影響を受ける複数のブランチがある場合は、ブランチごとに手順全体を繰り返す必要があります。ブランチをチェックし、git rebase -iを実行して完了します(git rebase --continueが「正常にリベースされました」と表示されている場合)。次のブランチをチェックアウトしてもう一度実行します。

今後、Windowsと実際のOSの間で開発作業を分割する場合、Windowsはcygwinで動作しますか。 Cygwinの内部では、シンボリックリンクはシンボリックリンクであり、あなたのようにそれらを混乱させることはできません。

8

ここには、戻ってコミットを修正する必要がないソリューションがあります。 リポジトリがリモートまたは共有されていると、それが実現できない可能性があります。 core.symlinks = falseを使用します。あなたはこれを試してみたが、いつ言っていないと言った。 チェックアウトの前に行う必要があります。通常は、通常のクローンがデフォルトで行います。 --no-checkoutオプションでクローンする必要があります。あなたが偽= core.symlinksとレポに多くの作業を行うにはしたくないので、最後のステップが重要であることを

git clone --no-checkout the-repo tmp-clone-dir 
cd tmp-clone-dir 
git config core.symlinks false 
git checkout 
cp the-problem-file the-problem-file.bak # make a backup 
git rm the-problem-file 
git commit -m 'Removed problem file pretending to be a symlink' the-problem-file 
mv the-problem-file.bak the-problem-file # restore the backup; now it will be of type file 
git commit -m 'Added back the problem file - now with the correct type' the-problem-file 
git push origin master 
cd .. 
\rm -rf tmp-clone-dir # IMPORTANT 

。それはただのトラブルを求めているだけです。

上記は、ファイルがシンボリックリンクではないファイルであることを前提としています。シンボリックリンクの場合は、最初のコミット後に停止し、tmp-clone-dirを削除し、通常のリポジトリチェックアウトに戻りシンボリックリンクを作成してコミットします。

この方法の利点は、関連するクローンとブランチが履歴を保持しているため、それを破らないことです。これの欠点は、壊れたコミットがまだそこに残っていることと、その特定の悪いコミットを使用しようとすると誰にでも問題を引き起こすことです。

+0

プラス2 – jomofrodo

2

私は、これは私のためにそれを解決し、この問題を持っていた:

git config core.symlinks false 
git rm <problem-file> 
git commit <problem-file> 
git push 
git config core.symlinks true 
1

あなたはビットバケットを使用している場合はもっと簡単な方法もあります。 Bitbucketはファイルのオンライン削除をサポートしているので、Bitbucketのレポに行くことができます。問題のあるファイルを見つけて、「編集」ボタンと「削除」の近くにあるドロップダウンボタンを押してください。

これにより、シンボリックリンクが壊れているファイルが削除され、再度作業ディレクトリが作成されます。この可能性がある場合は、手動でリベースおよび削除するよりもはるかに高速です。

関連する問題