web-dev-qa-db-ja.com

GoDaddyホスティングプランでGitリポジトリを設定する

Gitを使用してバージョン管理されているプロジェクトがあります。

FTPでドラッグアンドドロップするのではなく、プッシュでデプロイできるように、(sshが有効な)GoDaddy共有ホスティングパッケージにリポジトリをセットアップすることができるようにしたいです。

任意のヒントをいただければ幸いです。最善の方法は、既にそれを実行した人のアカウントですが、個人的にオンラインで見つけることはできませんでした。

14
Tom Wright

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を実行して、不足している共有ライブラリについて文句を言うことをお勧めします。そうでない場合、あなたは(おそらく)行ってもいいです。ある場合は、読み続けてください。 (ターゲットホストにすでに存在し、正しいバージョンである場合は、共有ライブラリをコピーして使用しないでください。)

scprsyncftp、または使い慣れたものでファイルをコピーできます。私は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_PATHman 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~/libtarget_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つだけです。

これらの手順に誤りを見つけた場合、またはより良い解決策を知っている場合は、私に知らせてください。

23
Tyler Rick

私は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

2
user9822

これを行う最も簡単な方法は、リモートサーバーで次のようなものを実行することです。

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ページを起動してください。

0
mattikus