web-dev-qa-db-ja.com

「git update-index --chmod = + x」を実行可能ファイルに自動的に適用する

私は頻繁にgitリポジトリにbashスクリプトを追加しますが、スクリプトにはgit addの前にLinuxファイルシステムで実行権限があります。ただし、追加されたファイルをリモートリポジトリにプッシュし、別の場所にプルすると、ファイルは実行不可能な権限で表示されます。問題を修正するには2つの方法があるようです。

1. chmod u+x $script 
   git commit -am "fixing the script permissions... again..."

または

2. git update-index --chmod=+x $script

毎回アクセス許可を修正する代わりに、git add中にgitにスクリプトのファイルアクセス許可を単純に見てもらい、「こっち、これは実行可能ファイルです!」実行可能な権限でリポジトリに直接追加しますか?

52
Byron Hawkins

それにはいくつかの方法があります。

  1. Gitエイリアス
  2. Bashエイリアス
  3. または、bashエイリアスとgitエイリアスを組み合わせます
  1. Gitエイリアス

    Gitエイリアス内で常にbashを使用できます。

    • Git configを開きます:

      vim ~/.gitconfig

    • エイリアスセクションを追加します(存在しない場合):

      [alias]
          addscr = !sh -c 'if [[ ${0: -3} == ".sh" ]]; then git update-index --chmod=+x $0; git add $0'
      
  2. バッシュエイリアス

    • Bashプロファイルファイルを編集します。

      vim ~/.bashrc

    • これをファイルの最後に追加します。

      function gitadd(){
          if [[ ${1: -3} == ".sh" ]]
              then git update-index --chmod=+x $1
          fi
          git add $1
       }
       alias gitadd='gitadd'
      
  3. gitとbashのエイリアスを組み合わせる

    • Bashプロファイルファイルを編集します。

      vim ~/.bashrc

    • これをファイルの最後に追加します。

      function checkShellFile(){
          return ${1: -3} == ".sh"
      }
      alias gitadd='checkShellFile ? git addsrcipt "$1" : && git add "$1"'
      
    • Git configファイルを編集します。

      vim ~/.gitconfig

    • エイリアスセクションを追加します(存在しない場合):

      [alias]
          addscript = !sh -c 'git update-index --chmod=+x $0 && git add $0'
      

上記のいずれもテストされていません

14
PassTeT

git 2.9.X/2.10(2016年第3四半期)は、chmodgit add自体にもたらします!

commit 4e55ed (2016年5月31日) Edward Thomson(ethomson を参照してください。
サポート: ヨハネスシンデリン(dscho
J浜野邦夫-gitster- in commit c8b080a 、06 Jul 2016)に合併)

add--chmod=+x/--chmod=-xオプションを追加

core.filemodeがfalseに設定されているリポジトリ内のパスでは、実行可能ビットは検出されません(したがって、設定されません)。ただし、ユーザーはdoにはcore.filemode機能があります。
たとえば、シェルスクリプトを追加するWindowsユーザーは、Windows以外のユーザーとの互換性のために、それらを実行可能ファイルとして追加することができます。

これは配管コマンド(git update-index --add --chmod=+x foo)で行うことができますが、git-addコマンドを教えることにより、ユーザーは既に使い慣れたコマンドで実行可能ファイルを設定できますwith

この新機能の起源は、「 WindowsのGitでファイル実行モードの権限を作成する方法 (2011年2月)」で確認できます。

26
VonC

「git update-index --chmod + x」を実行可能ファイルに自動的に適用するスクリプトを次に示します。

for f in `find . -name '*.sh' -o -regex './s?bin/[^/]+' -o -regex './usr/sbin/[^/]+' -o -regex './usr/lib/[^/]+' `;do
 ( cd `dirname $f` && git update-index --chmod=+x  `basename $f` )
done 
7
l0pan

派手なbashスクリプトを使用しないソリューション

  1. fileMode = trueファイルに.git/configを設定します(または他の人が指摘したようにgit config core.filemode trueを実行します)
  2. ファイルのパーミッションの実行可能ビットを変更し、この変更をコミットします。 (chmod u+x $script指摘したとおり)。これは一度だけ行う必要があります。
  3. リモコンにプッシュ

次にそこからプルするとき、gitはコミットされた実行可能ビットをファイルに設定します。私も同様の問題を抱えていましたが、これで解決しました。

fileMode = trueはgitに、許可される許可に関する唯一のもの、つまり実行可能ビットを追跡するよう指示します。これは、実行可能ビットへの変更が作業ツリーの変更としてgitによって認識され、それらの変更が次回のコミットでリポジトリに保存されることを意味します。

目的の実行可能ビットをコミットしたら、fileModefalseにリセットすることもできます。これにより、次回コミットしたくないときにgitがそのような変更に煩わされることがなくなります。

3
A. Sallai

これはgit addコマンドで実行できるとは思いませんが、git commitコマンドを実行した直後に、コミットが実際に作成される前にスクリプトを実行できる場合があります。

Pre-commitフックを見てください。

http://git-scm.com/book/en/Customizing-Git-Git-Hooks

基本的には、pre-commitというファイルを.git/hooks /フォルダーに作成するだけです。 (フックフォルダーに既にサンプルがあるはずです。サンプルの名前を変更して、末尾の「.sample」を削除してアクティブにします。)

落とし穴があります。実際にステージングされたバージョンのファイルで作業できるように、スクリプトが最初にgit stash -qを実行することを確認してください。

1
eddiemoya