จะทราบได้อย่างไรว่าไฟล์ถูกคอมไพล์แล้ว (โดยรหัสทางออกของเชลล์)?


357

มีวิธีที่จะบอกว่าไฟล์ถูกติดตามโดยการรันgitคำสั่งและตรวจสอบรหัสออกหรือไม่?

กล่าวอีกนัยหนึ่งคือคอมไพล์กำลังติดตามไฟล์หรือไม่


ฉันคิดว่าประเด็นคืออะไรเกณฑ์ในการตัดสินใจเลือกไฟล์ที่ถูกติดตามหรือไม่ได้ติดตาม ควรมีคอลเล็กชันไฟล์ที่ติดตามเพื่อค้นหา
smwikipedia

คำตอบ:


443

ลอง:

git ls-files --error-unmatch <file name>

จะออกด้วย 1 หากไฟล์ไม่ถูกติดตาม


อย่างน้อยด้วย git เวอร์ชันเก่า (1.6.0) ของคุณคุณต้องใส่--error-unmatchตัวเลือกก่อนชื่อไฟล์เพื่อรับข้อผิดพลาด อย่างใดตัวเลือกจะนำไปใช้กับชื่อไฟล์ที่ตามมาเท่านั้น
Alex Dupuy

ที่จริงแล้วปัญหาดูเหมือนว่า GNU getopt ตัวเลือกไม่อนุญาตให้เปิดใช้งานและเมื่อปรากฏหลังจากชื่อไฟล์ (หรือหลังจาก--) ไฟล์--error-unmatchจะถือว่าเป็นชื่อไฟล์ (ไม่ใช่ในดัชนี) และไม่มีผลใด ๆ
Alex Dupuy

29
git ls-files | grep <PATTERN>? ตัวอย่าง:git ls-files | grep Main.h
gaussblurinc

1
[วิธีการไร้เดียงสา] ทำการเปลี่ยนแปลงเล็กน้อยในไฟล์ (เพิ่ม / ลบช่องว่าง) และดูว่าไฟล์นั้นอยู่ในรายการเมื่อ 'สถานะ git' ถูกพิมพ์หรือไม่ วิธีที่โง่ แต่อาจช่วยประหยัดเวลา
BraveNinja

แต่ฉันเพิ่มและกระทำด้วยคำสั่ง "git เพิ่ม -A && git กระทำคำสั่ง -m" blah "แม้เห็นไฟล์ทั้งหมดด้วยคำสั่ง" git ls-tree --name-only -r sha1 "
Dr.jacky

66

หากคุณไม่ต้องการถ่วงคอนโซลด้วยข้อความแสดงข้อผิดพลาดคุณสามารถเรียกใช้

git ls-files file_name

จากนั้นตรวจสอบผลลัพธ์ หาก git ไม่ส่งคืนอะไรแสดงว่าไฟล์นั้นไม่ถูกติดตาม หากมีการติดตามคอมไพล์จะส่งคืนพา ธ ของไฟล์

สิ่งนี้มีประโยชน์ถ้าคุณต้องการรวมไว้ในสคริปต์เช่น PowerShell:

$gitResult = (git ls-files $_) | out-string
if ($gitResult.length -ne 0)
{
    ## do stuff with the tracked file
}

ฉันคิดว่าfile_nameจะต้องมีการจับคู่ที่แน่นอน (เส้นทางแบบเต็ม + ชื่อไฟล์) แต่สามารถใช้กับ wildcards:git ls-files *foo.rb
23919

16

แก้ไข

หากคุณต้องการใช้คอมไพล์จาก bash มี--porcelainตัวเลือกให้git status:

--porcelain

ให้เอาต์พุตในรูปแบบที่เสถียรและง่ายต่อการแยกวิเคราะห์สำหรับสคริปต์ ขณะนี้สิ่งนี้เหมือนกันกับ - เอาต์พุตแบบย่อ แต่รับประกันได้ว่าจะไม่เปลี่ยนแปลงในอนาคตทำให้ปลอดภัยสำหรับสคริปต์

ผลลัพธ์มีดังนี้:

> git status --porcelain
 M starthudson.sh
?? bla

หรือถ้าคุณทำทีละไฟล์เท่านั้น:

> git status --porcelain bla
?? bla

ORIGINAL

ทำ:

git status

คุณจะเห็นรายงานระบุว่าไฟล์ใดได้รับการอัพเดตและไฟล์ใดที่ไม่ได้ติดตาม

คุณสามารถดูbla.shการติดตามและแก้ไขและnewblaไม่ได้ติดตาม:

# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#
#       modified:   bla.sh
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       newbla
no changes added to commit (use "git add" and/or "git commit -a")

ขอโทษฉันควรชัดเจนกว่านี้ สถานะไม่เป็นไร แต่ฉันต้องการตรวจสอบรหัสออกมากกว่าการแยกวิเคราะห์ผลลัพธ์
Dale Forester

git status --porcelainคือเพื่อนของคุณถ้าคุณต้องการแยกวิเคราะห์ผลลัพธ์ด้วยสคริปต์ดูที่เอกสารที่เชื่อมโยงซึ่งแสดงตัวเลือกที่มีประโยชน์อื่น ๆ
stefanB

Hihi ไม่ทำงานกับ Git ที่เก่ามาก: git status --porcelain error: unknown option Porcelain 'Version 1.6.0 :-)
Laryx Decidua

@ user465139 ที่ถูกต้อง ... คุณต้อง git 1.7.0 หรือใหม่กว่า (ตัวเลือกลายครามไม่ได้ถูกเพิ่มจนกว่าจะถึงตอนนั้น)
mason81

13

ลองรันgit statusไฟล์ มันจะพิมพ์ข้อผิดพลาดหากไม่ได้ติดตามโดย git

PS$> git status foo.txt
error: pathspec 'foo.txt' did not match any file(s) known to git.

ว้าว. ฉันต้องเรียกใช้บนไดเรกทอรีและมันทำหน้าที่เหมือนกำลังตรวจสอบ repo ทั้งหมด ขอบคุณ
Dale Forester

4
ที่จริงแล้วถ้าฉันเรียกใช้git status trackedfileฉันได้รับรหัสทางออก 1 (คาดว่า 0 จะเป็นประโยชน์) แต่ก็ไม่ได้ให้ "ข้อผิดพลาด:" ในผลลัพธ์ ฉันต้องการแยกรหัสทางออกมากกว่าเอาท์พุทสตริง
Dale Forester

43
ฉันพบว่าไม่มีข้อผิดพลาดเกิดขึ้นหากฉันเรียกใช้สถานะ git ในไฟล์ที่มีอยู่ในสำเนาการทำงานของ git แต่ไม่รวมโดย. gitignore (เช่นคำตอบนี้จะไม่ทำ)
JellicleCat

โปรดทราบว่ามันใช้งานไม่ได้หากไฟล์อยู่ในรายชื่อที่ไม่ใช้เช่นในไฟล์.gitignore
Robin Hsu

8
ไม่ได้ผล มันพิมพ์สิ่งเดียวกันเสมอแม้ว่าไฟล์จะไม่มีอยู่ $ git status notthere:On branch master nothing to commit, working directory clean
Chloe

6

ฉันไม่รู้คำสั่ง git ใด ๆ ที่ให้รหัสทางออก "ไม่ดี" แต่ดูเหมือนว่าวิธีง่าย ๆ ที่จะทำคือใช้คำสั่ง git ที่ให้ผลลัพธ์สำหรับไฟล์ที่ไม่มีการติดตามเช่น git-log หรือ git-ls-files ด้วยวิธีนี้คุณไม่จำเป็นต้องทำการวิเคราะห์คำใด ๆ เลยคุณสามารถเรียกใช้งานผ่านยูทิลิตี้ง่ายๆอย่าง grep เพื่อดูว่ามีเอาต์พุตหรือไม่

ตัวอย่างเช่น,

git-ls-files test_file.c | grep

จะออกด้วยรหัสศูนย์หากไฟล์นั้นถูกติดตาม แต่รหัสทางออกของหนึ่งรหัสหากไฟล์นั้นไม่ถูกติดตาม


3

ผมขอแนะนำที่กำหนดเองนามแฝง.gitconfigกับคุณ

คุณต้องทำ:

1) ด้วยคำสั่ง git:

git config --global alias.check-file <command>

2) การแก้ไข~/.gitconfigและเพิ่มบรรทัดนี้ในส่วนนามแฝง:

[alias]
    check-file = "!f() { if [ $# -eq 0 ]; then echo 'Filename missing!'; else tracked=$(git ls-files ${1}); if [[ -z ${tracked} ]]; then echo 'File not tracked'; else echo 'File tracked'; fi; fi;  };  f"

เมื่อเปิดใช้คำสั่ง (1) หรือไฟล์ที่บันทึก (2) บนพื้นที่ทำงานของคุณคุณสามารถทดสอบได้:

$ git check-file
$ Filename missing 

$ git check-file README.md
$ File tracked 

$ git check-file foo
$ File not tracked

2

การใช้git logจะให้ข้อมูลเกี่ยวกับเรื่องนี้ หากไฟล์มีการติดตามในคอมไพล์คำสั่งจะแสดงผลลัพธ์บางอย่าง (บันทึก) มิฉะนั้นมันจะว่างเปล่า

ตัวอย่างเช่นหากไฟล์นั้นมีการติดตามคอมไพล์

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
commit ad9180b772d5c64dcd79a6cbb9487bd2ef08cbfc
Author: User <someone@somedomain.com>
Date:   Mon Feb 20 07:45:04 2017 -0600

    fix eslint indentation errors
....
....

หากไฟล์ไม่ได้ถูกคอมไพล์

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
root@user-ubuntu:~/project-repo-directory#

1

แค่สองเซ็นต์ของฉัน:

git ls-files | grep -x relative/path

ซึ่งrelative/pathสามารถกำหนดได้อย่างง่ายดายโดยการกดtabภายในเชลล์เติมภาพอัตโนมัติ เพิ่มส่วนเพิ่มเติม| wc -l เพื่อรับเอาต์พุต 1 หรือ 0


ทั้งนี้ขึ้นอยู่กับเส้นทาง (เช่นถ้ามีจุด) คุณควรเพิ่มตัวเลือกgrep --fixed-strings
EndlosSchleife
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.