Gitを使用してバージョン管理されているプロジェクトがあります。
FTPでドラッグアンドドロップするのではなく、プッシュでデプロイできるように、(sshが有効な)GoDaddy共有ホスティングパッケージにリポジトリをセットアップすることができるようにしたいです。
任意のヒントをいただければ幸いです。最善の方法は、既にそれを実行した人のアカウントですが、個人的にオンラインで見つけることはできませんでした。
HostNine共有ホスティングパッケージでホストしていたサイトで同じ問題が発生しました。彼らもあなたにssh
アクセス権を与えていますが、残念ながらgit
がインストールされておらず、gcc
を実行するためのアクセス権さえ与えられていないため、ダウンロードやユーザーのgitをインストールします。
これらの制限を回避するために私が考えることができた唯一の方法は、それらを持っている別のコンピュータからgitバイナリをコピーすることでした。おそらく、同じソリューションがあなたとあなたのGoDaddy共有ホストで機能するでしょう。これが私がしたことです:
まず、サーバーのアーキテクチャを把握します。私の場合、それは32ビット(i386)でした。これを理解する方法はいくつかあります。
# uname -a
Linux ___.myserverhosts.com 2.6.18-128.1.6.el5PAE #1 SMP Wed Apr 1 10:02:22 EDT 2009 i686 i686 i386 GNU/Linux
# file /bin/echo
/bin/echo: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
次に、同じアーキテクチャーでgitがインストールされているLinuxを実行している別のコンピューターを見つける必要があります。それらが同じアーキテクチャーであり、必要なバイナリーとライブラリー・ファイルを見つけることができる限り、それらはLinuxの同じディストリビューションまたはバージョンを実行している必要はありません。
メインのgitバイナリの場所を見つけるには:
> which git
/usr/local/bin/git
他のいくつかの重要なバイナリ(git-receive-pack
など)も同じディレクトリにあるため、/usr/local/bin/git*
をすべてコピーして、必要なものをすべて入手できるようにすることをお勧めします。
その他の重要なファイルは、gitが依存するファイルで、ソースシステムのどこかにある「libexec」ディレクトリの下にあります。これらをコピーしないと、git Push
を実行しようとすると、次のような驚くべきエラーメッセージが表示される場合があります。
git: 'index-pack' is not a git-command. See 'git --help'.
コアgitライブラリを含むディレクトリをtarget_Hostで見つけるには、次のコマンドを使用できます。
> git --exec-path
/usr/local/libexec/git-core
最初にこれらのファイルをコピーしてから、gitを実行して、不足している共有ライブラリについて文句を言うことをお勧めします。そうでない場合、あなたは(おそらく)行ってもいいです。ある場合は、読み続けてください。 (ターゲットホストにすでに存在し、正しいバージョンである場合は、共有ライブラリをコピーして使用しないでください。)
scp
、rsync
、ftp
、または使い慣れたものでファイルをコピーできます。私はscp
を次のように使用しました:
> ssh target_Host 'mkdir -p ~/bin ~/libexec'
> scp /usr/local/bin/git* target_Host:~/bin
> scp -r /usr/local/libexec/git-core target_Host:~/libexec
次に、sshでtarget_Hostにアクセスします。次のような行を~/.bashrc
に追加する必要があります。
export PATH=$PATH:~/bin
export LD_LIBRARY_PATH=~/lib
export GIT_EXEC_PATH=~/libexec/git-core
この手順を忘れた場合、git Push
を実行すると、このエラーが表示されて驚かれることがあります。
git-receive-pack: command not found
これは、git.or.czのGit FAQ:
基本的に問題は、「git-receive-pack」がリモートエンドのデフォルトの$ PATHにないことです。
...
.bashrc
に正しいパスが設定されていることを確認してください(.bash_profile
だけでなく)
GIT_EXEC_PATH
はman git
に記載されています:
--exec-path
Path to wherever your core git programs are installed.
This can also be controlled by setting the GIT_EXEC_PATH
environment variable. If no path is given, git will print
the current setting and then exit.
新しい~/.bashrc
を入手します。 git
を実行してみてください。
これは私に最初に与えたものです:
> git
git: error while loading shared libraries: libcrypto.so.4: cannot open shared object file: No such file or directory
ソースマシンでこれを実行することにより、コピーする共有ライブラリの場所を見つけることができました。
> ldd /usr/local/bin/git
libz.so.1 => /usr/lib/libz.so.1 (0xb7fcf000)
libcrypto.so.4 => /lib/libcrypto.so.4 (0xb7ee4000)
libpthread.so.0 => /lib/tls/libpthread.so.0 (0xb7ed2000)
libc.so.6 => /lib/tls/libc.so.6 (0xb7da6000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0xb7d92000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0xb7d2d000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0xb7d2a000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0xb7d08000)
libresolv.so.2 => /lib/libresolv.so.2 (0xb7cf5000)
libdl.so.2 => /lib/libdl.so.2 (0xb7cf1000)
/lib/ld-linux.so.2 (0xb7fe8000)
私の場合、/lib/libcrypto.so.4
を~/lib
にtarget_Host
にコピーするだけで、すべて問題ありませんでした。
これで、共有ホスティングサーバーでgit
が機能し、Pushできるはずです。
次に、サーバー上に新しいgitリポジトリと作業ツリーを作成するか、既存のリポジトリ/作業ツリーをコピーする必要があります。
ちなみに、実際のコンテンツファイルをデプロイしたいと言ったので、この場合、サーバー上で必要なのはベアリポジトリではないと思います(単にconfig HEAD objects/ refs/
を実行するたびに、git Push
ファイル(ベアリポジトリに含まれる).
toolmantim.com は、通常のgitリポジトリとベアリポジトリの違いを説明しています。
デフォルトのgitリポジトリは、作業ディレクトリとして使用することを想定しているため、gitは実際のベアリポジトリファイルをすべてのプロジェクトファイルと一緒に.gitディレクトリに格納します。リモートリポジトリは、作業コピーとは異なり、ファイルシステム上のファイルのコピーを必要としません。必要なのは、リポジトリ自体の差分とバイナリのwhat-notsだけです。これがgitにとって「ベア」の意味です。リポジトリそのもの。
ここでは、target_Host
に、Webサイト(または展開するもの)を展開するディレクトリをすでに作成していると仮定します。そのディレクトリを~/www/my_site
と呼びましょう。すべてのファイルを~/www/my_site already
にFTPで転送している場合もあります。 (あなたが持っているかどうかは重要ではありません。)今のところ、.gitサブディレクトリを~/www/my_site
にまだコピーしていないと仮定します(持っている場合は問題なく動作します)。
Target_Hostで初期化されたgitリポジトリがまだないため、最初のステップはそれを作成することです。
> cd ~/www/my_site
> git init
次に、展開したい最新の変更を含むリポジトリがあるホスト(開発ボックスだと思います)から、次のように展開するだけです。
> git Push --all ssh://username@target_Host:port/~/www/my_site/.git
target_Host
のリポジトリがまだ最新でない場合、次のような警告が表示されることがあります。
> warning: updating the current branch
> warning: Updating the currently checked out branch may cause confusion,
> warning: as the index and work tree do not reflect changes that are in HEAD.
> warning: As a result, you may see the changes you just pushed into it
> warning: reverted when you run 'git diff' over there, and you may want
> warning: to run 'git reset --hard' before starting to work to recover.
> warning:
> warning: You can set 'receive.denyCurrentBranch' configuration variable to
> warning: 'refuse' in the remote repository to forbid pushing into its
> warning: current branch.
> warning: To allow pushing into the current branch, you can set it to 'ignore';
> warning: but this is not recommended unless you arranged to update its work
> warning: tree to match what you pushed in some other way.
> warning:
> warning: To squelch this message, you can set it to 'warn'.
> warning:
> warning: Note that the default will change in a future version of git
> warning: to refuse updating the current branch unless you have the
> warning: configuration variable set to either 'ignore' or 'warn'.
(通常のgit
の使用では、通常bareリポジトリにプッシュしているため、そのメッセージは表示されません。しかし、この場合のリモートリポジトリは作業ツリーとインデックスの両方を備えた通常のリポジトリ、git
は、混乱を招く可能性があることを理解しています。
ただし、サーバーでリポジトリを直接コミットしない可能性が高いため、サーバーで「無視」に設定しても安全だと思います。 (すべてのコミットはおそらく開発リポジトリで発生し、サーバーにプッシュされます。)
だから先に進んで、プッシュするたびに警告が表示されないように設定してください:
> ssh target_Host 'cd ~/www/my_site/; git config receive.denyCurrentBranch ignore'
Push
自体はインデックスを更新するだけですが、[〜#〜]ではありません[〜#〜]作業ツリー内のファイル自体。これらのファイルの更新は、私たちがやろうとしていることの全体像にすぎないので、git
にインデックスの内容を作業ツリー自体に書き出すように指示するまで、ジョブは完了しません。 、 そのようです:
> ssh target_Host 'cd ~/www/my_site/; git reset --hard'
(注:サーバーの作業ツリーで行った変更は、リポジトリの内容によって上書きされます。)
私はmattikusの提案にも従い、サーバー用のリモートを作成しました。
> git remote add h9 ssh://username@target_Host:port/~/www/my_site/.git
だから私がデプロイするためにしなければならないすべては次のとおりです:
> git Push --all --force h9
> ssh remote_Host 'cd ~/www/my_site/; git reset --hard'
私はscript/deploy
という名前のスクリプトでこれらのコマンドをスローするまで行ったので、展開したいときはいつでも、実行するコマンドは1つだけです。
これらの手順に誤りを見つけた場合、またはより良い解決策を知っている場合は、私に知らせてください。
私はSFとgodaddy n00bの両方なので、我慢してください。しかし、とにかく、これがここで説明されているのを見てとても嬉しく思います。
私の0.02ドルだけで、Linuxボックスでgitを(動的に)ビルドし、それを私のgodaddyアカウントに引き渡そうとしましたが、単にパッシブなgodaddyマシンに単にPushしようとしても、opensslがないために失敗します。おそらく、opensslで静的にgitをビルドしようとすると、それも悪い考えのように思えます。
$ git remote add godaddy ssh://[email protected]//home/content/u/n/c/unclecj/foo.git
$ git Push godaddy master
bash: git-receive-pack: command not found
fatal: The remote end hung up unexpectedly
$ git Push --receive-pack="/home/content/u/n/c/unclecj/opt/git-1.6.3/bin/git-receive-pack" godaddy master
/home/content/u/n/c/unclecj/opt/git-1.6.3/bin/git-receive-pack: error while loading shared libraries: libcrypto.so.0.9.8: cannot open shared object file: No such file or directory
fatal: The remote end hung up unexpectedly
話題外ですが、これは私がgodaddyに期待するサポートの不足のようなものですか?代わりにドリームホストを選択しないことを後悔する必要がありますか?
よろしくCJ
PS。答えではありませんが、いったんgit-receiveがgodaddyで機能している場合(そうですか?)、分離されたワークツリーを持つリポジトリは、Webにデプロイするための優れた方法です http://toroid.org/ ams/git-website-howto
これを行う最も簡単な方法は、リモートサーバーで次のようなものを実行することです。
mkdir repo.git
cd repo.git
git init --bare
次に、開発チェックアウトで:
git Push --all ssh://<username>@<your server>/~/path/to/repo/relative/to/homedir/repo.git
サーバーなどは必要ありません。また、sshアクセスができる限り、そのマシンからフェッチ/プルできるはずです。
.ssh/configもセットアップしている場合は、それを利用して、セットアップした秘密鍵を使用する必要があります。
更新を頻繁にプッシュすることを計画している場合は、リモートリポジトリを開発チェックアウトに追加できます。
git remote add godaddy ssh://<username>@<your server>/path/to/repo.git
その後、次のことができます。
git Push godaddy
詳細については、 オンラインドキュメントgit Push
を確認するか、git Push --help
を実行してローカルでmanページを起動してください。