質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Q&A

解決済

3回答

9582閲覧

公開ディレクトリに.gitディレクトリを置くのはセキュリティとして問題でしょうか?

t.tohda

総合スコア15

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

1グッド

2クリップ

投稿2018/02/28 00:21

古い記事ですが、gitで本番環境にデプロイするのはセキュリティ上問題なのかと悩んでいます。
【警鐘】1/600の割合でWebサイトが「.git」ディレクトリを公開している事が判明 | ソフトアンテナブログ

現在の運用方法は、本番環境(例:/var/www/html/)にGitHubからgit cloneして、更新がある毎にgit pullで反映しています。

そうすると、
/var/www/html/hoge/.git というディレクトリが本番環境にできてしまいます。
パスワードや個人情報などはgitで管理していませんが、一般的な方法があれば教えてほしいです。

また、
/var/www/html/hoge/package.jsonなどの設定ファイルも置かれてしまいますが、アクセスして参照できるのはどうなのかも教えて欲しいです。

mikkame👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

.git/configとGitの履歴に秘匿したい情報が一切なければ良いんじゃないでしょうか?
不味い例の一つとして、GitHubからクローンする時にhttpsの場合はベーシック認証の情報を埋め込む事が可能だったりします。

  • 一般的な方法: git clone https://github.com/miyabisun/dotfiles.git
  • ベーシック認証: git clone https://miyabisun:password@github.com/miyabisun/dotfiles.git

後者のようにすると、git pullgit push等でいちいちパスワードを聞かれずに済んで楽なんですよね。
ところが.git/configファイルを確認すると…
url = https://miyabisun:password@github.com/miyabisun/dotfiles.git
そのまんま格納するんかい! はいアウト。

.htaccessファイル(apache時)等でガチガチに守る方法もありますが、
ファイルやディレクトリの増減への対応が難しいので、そもそも公開領域に.gitを置かない方が良いでしょうね。

一般的な方法があれば教えてほしいです。

私がよく配置しているディレクトリ構成はこんな感じです。

/var/www/[プロジェクト名]/ .git/ public/ index.html css/ style.css js/ bundle.js src/ templates/ index.pug stylesheets/ style.sass scripts/ main.ts package.json

まぁ、/var/wwwの配下にある必要もないので何処でも良いですが、流石に/var/www/htmlはやめましょう

対応策ですが色々あります。
本番環境がgit pullしたいだけならば、public/配下の生成したファイルもgit管理下に置いて構いません。

  • 元からある/var/www/htmlディレクトリは削除、/var/www/[プロジェクト名]/publicのシンボリックリンクにすげかえ
  • httpd.conf(apache時)を修正して公開領域を/var/www/[プロジェクト名]/public配下に変更

投稿2018/02/28 01:29

編集2018/02/28 01:31
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t.tohda

2018/02/28 13:24

.git/configファイルにパスワードも記載されるとは知りませんでした。 Basic認証つきでcloneすることは今のところ想定していませんが、やはり公開ディレクトリには最低限のファイルだけ置くようにします。 ディレクトリ構成もとても参考になりました。ありがとうございます!
guest

0

Webサーバの機能で.gitディレクトリを隠す方法が紹介されていますね。
https://stackoverflow.com/questions/25001405/git-having-server-git-repo-push-to-public-html

別のやり方で.gitディレクトリを非公開ディレクトリに置くパターンもありかと

/var/www/public_html が公開ディレクトリ
/etc/gitdir は.git内ファイルを置く(置かれるの方が正しい?)ディレクトリとした場合

clone

cd /var/www/public_html git clone --separate-git-dir /etc/gitdir https://hogehoge/hoge.git

pull

cd /var/www/public_html git --git-dir=/etc/gitdir pull

package.jsonも見せる必要が無いので隠したいですが思いつきません。

投稿2018/02/28 01:13

mosapride

総合スコア1480

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t.tohda

2018/02/28 13:29

--separate-git-dir というオプションがとても参考になりました。 すでに.gitがある状態だったのですが、 $ git init --separate-git-dir=/tmp/hogehoge とすると、現在のリポジトリ内容を保ったまま、外部に.gitを移すことができました! ありがとうございます!
guest

0

自己解決

みなさんの意見を参考に模索してみました。
懸念点などあれば教えてもらえると助かります。

試したこと

/var/www/html/.git が既にある場合です。

bash

1$ git init --separate-git-dir=/home/users/hoge 2Reinitialized existing Git repository in /home/users/hoge/

上記コマンドで、ワークスペースは /var/www/html/ のまま、
/home/users/hoge というリポジトリのディレクトリが作成されました。

元々あった /var/www/html/.gitはファイルに変更され、リポジトリの場所が記載されていました。

bash

1$ ls /home/users/hoge 2COMMIT_EDITMSG HEAD branches description index lfs objects refs 3FETCH_HEAD ORIG_HEAD config hooks info logs packed-refs 4 5$ cat /var/www/html/.git 6gitdir: /home/users/hoge

最終的にやったこと

.gitの場所を非公開ディレクトリにするだけでは、結局 package.json とか README.md が公開ディレクトリに置かれるので、どうしようかと思い行き着いた結果です。

  • 開発ディレクトリ内に公開用ディレクトリを置く
  • 本番環境には特定ディレクトリのみpullする

参考:Gitで特定のディレクトリだけcloneする方法 - Qiita

リモートリポジトリの構造
repo/
├ public/
│ ├ index.html
│ └ style.css
├ src/
│ ├ index.html
│ └ style.scss
├ tests/
├ .git
├ .gitignore
├ README.md
├ ...
└ package.json

本番環境には/var/www/html/.git が既にある状態です。

bash

1$ git config core.sparsecheckout true 2 3# pull したいディレクトリ(/public)を書きます。 4$ vi .git/info/sparse-checkout 5 6$ cat .git/info/sparse-checkout 7/public 8 9# このコマンドを打つと、/public のみになります。 10$ git read-tree -m -u HEAD 11 12# リポジトリのディレクトリを非公開範囲に変更します。 13$ git init --separate-git-dir=/home/users/hoge 14Reinitialized existing Git repository in /home/users/hoge/

Git - git-read-tree Documentationより。
read-tree - ツリー情報をインデックスに読み込みます。
gitのread-treeが返ってくると、矛盾しているパスだけが結合解除状態になります。

-m
読み込みだけでなく、マージを実行します

-u
マージが成功したら、マージの結果をワークツリー内のファイルに更新します。

投稿2018/02/28 14:05

t.tohda

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問