12

変更された一連のファイルをscpテスト用に別のボックスに移動する必要があります。最小限の労力でアクションをスクリプト化できるように、次git statusのようなリストを作成する方法を理解するのに苦労しています。ls -1

を使用して必要なことを実行する既存のスクリプトがありls -1ます。私は才能のあるスクリプターではないので、スクリプトを変更したくありません。代わりに、ツールの出力を変更したいと考えています。

明らかに、git status -1うまくいきませんでした。「git status」を取得して常に短い形式を使用する方法の形式は、私のスクリプトと互換性がありません。そしてgit status --column、以下と同じ結果が得られました。

git status行に変更されたファイルのみを表示して、変更されたファイルを 1 行に 1 つずつリストするにはどうすればよいですか?


$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 2 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   cryptest.vcproj
    modified:   dlltest.vcproj

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   adler32.cpp
    modified:   algebra.cpp
    modified:   algparam.cpp
    modified:   asn.cpp
    modified:   asn.h
    modified:   authenc.cpp
    modified:   authenc.h
    modified:   basecode.cpp
    modified:   cast.cpp
    modified:   ccm.cpp
    modified:   cmac.cpp
    modified:   config.h
    modified:   cryptdll.vcproj
    modified:   cryptlib.cpp
    modified:   cryptlib.h
    modified:   cryptlib.vcproj
    modified:   datatest.cpp
    modified:   dlltest.cpp
    modified:   eax.cpp
    modified:   ec2n.cpp
    modified:   eccrypto.cpp
    modified:   ecp.cpp
    modified:   emsa2.cpp
    modified:   eprecomp.cpp
    modified:   esign.cpp
    modified:   files.cpp
    modified:   filters.cpp
    modified:   filters.h
    modified:   fips140.cpp
    modified:   fipsalgt.cpp
    modified:   fltrimpl.h
    modified:   gf2_32.cpp
    modified:   gf2n.cpp
    modified:   gf2n.h
    modified:   gfpcrypt.cpp
    modified:   gfpcrypt.h
    modified:   hkdf.h
    modified:   hmac.cpp
    modified:   hrtimer.cpp
    modified:   ida.cpp
    modified:   idea.cpp
    modified:   integer.cpp
    modified:   iterhash.cpp
    modified:   luc.h
    modified:   misc.cpp
    modified:   misc.h
    modified:   modes.cpp
    modified:   modes.h
    modified:   nbtheory.cpp
    modified:   network.cpp
    modified:   oaep.cpp
    modified:   panama.cpp
    modified:   pkcspad.cpp
    modified:   polynomi.cpp
    modified:   pssr.cpp
    modified:   pubkey.h
    modified:   pwdbased.h
    modified:   queue.cpp
    modified:   rijndael.cpp
    modified:   rsa.cpp
    modified:   rw.cpp
    modified:   salsa.cpp
    modified:   seal.cpp
    modified:   secblock.h
    modified:   simple.h
    modified:   smartptr.h
    modified:   socketft.cpp
    modified:   socketft.h
    modified:   sosemanuk.cpp
    modified:   strciphr.cpp
    modified:   strciphr.h
    modified:   test.cpp
    modified:   validat1.cpp
    modified:   validat2.cpp
    modified:   vmac.cpp
    modified:   wait.cpp
    modified:   winpipes.cpp
    modified:   winpipes.h
    modified:   words.h
    modified:   xtr.cpp
    modified:   xtr.h
    modified:   zdeflate.cpp
    modified:   zinflate.cpp
4

5 に答える 5

3

トーマスが示唆したように、--porcelainオプションはあなたが望むものです。もちろん、変更されたファイルのファイル名だけを取得するには、その出力も解析する必要があります。たとえば、次のような単純な sed スクリプトを介して出力をパイプするとうまくいく場合があります。

git status --porcelain | sed -ne '/^M  */s///p'

Mこのスクリプトは、行頭のa と空白を検索します。それらが見つかった場合、それらは削除され、行が出力されます。Mそれらが見つからない場合 (つまり、出力が変更されたファイル以外のものである場合)、出力は表示されません。

上記のコマンド ラインの出力は、取得したものとほぼ同じである必要がありますls -1。つまり、ファイルのリストであり、その他の情報はありません。はファイル名を NULL で終了することに注意してください。その--porcelainため、出力が期待どおりに機能しない場合は、スクリプトまたは別のパイプで処理する必要がある場合があります。(について読むxargs(1))。

于 2015-07-20T18:40:43.997 に答える
3

変更されたファイルのリストについては、次のコマンドが役立ちます。

git diff --name-only

また

git diff --name-status

--name-status の出力では、ステータス (A、M、D) とファイル パス名がタブで区切られているため、cutコマンドで解析できます。

ステージングでもファイル リストを取得できる場合は、「--cache」オプションを使用できます。

于 2016-03-09T06:11:10.460 に答える
0

変更されたファイルとscpそれらをリモートサーバーに直接検出するには:

scp `git status --porcelain | cut -c 4-` bb:~/${PWD##*/}
于 2018-07-06T07:23:15.427 に答える