2015-07-20 78 views
5

我需要將一堆已更改的文件和scp這些文件放到不同的盒子進行測試。我無法弄清楚如何讓git status爲我提供像ls -1這樣的列表,因此我可以用最小的努力編寫腳本。「git status」簡短或像「ls -1」這樣的短格式?

我有一個現有的腳本,可以根據需要使用ls -1。我不是一個有天賦的編劇,所以我不想修改腳本。相反,我希望該工具修改其輸出。

顯然,git status -1沒有工作。 How can I get 'git status' to always use short format中的格式與我的腳本不兼容。並且git status --column產生了與以下相同的結果。

我如何擁有git status列出修改後的文件,一行一行,只有修改後的文件在行上?


$ 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 

回答

7

git status --porcelain

這在短格式輸出,但會跨越的Git的所有版本保持一致。

git-status documentation

這裏是從基準的摘錄:

- 陶瓷
給在易於解析格式腳本輸出。這與短輸出類似,但在Git 版本中保持穩定,並且與用戶配置無關。

+0

這仍然不會複製'ls -1'的輸出。謹慎擴大你的答案一點點? – ghoti

+0

謝謝。它的關閉,但有線上的其他字符。我想在一行中列出一個文件。 – jww

+0

不幸的是我不認爲你可以減少輸出。 'git-status'不只是列出文件。它提供了比這更多的信息,因此除了用該選項縮短輸出之外,您最好的選擇(也是唯一的選擇,我認爲)就是擁有自定義解析邏輯。 –

2

正如Thomas建議的那樣,--porcelain選項是你想要的。但是,當然,要獲得修改文件的文件名,您還需要解析該輸出。例如,通過這樣一個簡單的sed腳本管道輸出可能工作:在該行的開頭爲M和空白

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

這個腳本搜索。如果找到它們,它們將被刪除並打印出該行。如果未找到它們(即輸出不是M修飾文件),則不會顯示輸出。

上述命令行的輸出應該與您從ls -1得到的結果相同 - 即文件列表,沒有其他信息。請注意,--porcelain用NULL終止文件名,所以如果輸出不能像預期的那樣工作,您可能需要在腳本或另一個管道中處理該文件。 (閱讀約xargs(1))。

+0

你的答案不包括所有情況。只有完全暫存的文件纔會有'git status --porcelain'的輸出,它由'sed'處理。如果一個給定的文件被修改了,但是未被暫存,那麼輸出將看起來像這個「M an_unstaged_file」(在開始處有空格)更好的是,如果文件同時具有暫存和非暫存部分,則輸出將是'MM an_unstaged_and_staged_file'。 – werkritter

2

如果你有不分階段的變化,您可以列出類似ls -1與此命令一列列表中的所有感動文件:

git ls-files --modified --others --exclude-standard --directory

--modified選項顯示修改的文件和--others選項顯示其他未跟蹤的文件,如新文件; --exclude-standard忽略排除的文件,--directory僅列出目錄名稱,而不是其中的文件。有關更多信息,請參閱documentation

下面是我用快速的所有修改和新的文件複製到我的temp目錄,同時保留完整的目錄路徑(髒替代git stash)命令:

git ls-files --modified --others --exclude-standard --directory | xargs -I {} cp --parents {} ~/temp 

如果你已經添加要提交的文件(例如,git add -A .),那麼您可以使用接受的答案中的命令並提取第二列以獲取您的普通文件列表:

git status --porcelain | awk '{ print $2 }'

如果你想過濾由git的狀態行,那麼你可以做這樣的事情:

git status --porcelain | grep ^[AM] | awk '{ print $2 }'

這使您只含(M)列表修改,新增加的(A)文件。


更新:

  • 添加@ jotik的建議。
+1

'git ls-files --modified --other --exclude-standard --directory'可以通過考慮git排除文件來提供更好的輸出,而不會遞歸到不受版本控制的目錄中。 – jotik

1

對於修改的文件列表,以下命令可以是一個幫助。

git diff --name-only

git diff --name-status

INT的--name狀態,狀態(A,M,d)和文件路徑名由製表符分隔的輸出,則可以解析它通過cut命令。

如果您也可以在升級過程中獲取文件列表,則可以使用`--cache'選項。