มีวิธีที่จะบอกว่าไฟล์ถูกติดตามโดยการรันgitคำสั่งและตรวจสอบรหัสออกหรือไม่?
กล่าวอีกนัยหนึ่งคือคอมไพล์กำลังติดตามไฟล์หรือไม่
มีวิธีที่จะบอกว่าไฟล์ถูกติดตามโดยการรันgitคำสั่งและตรวจสอบรหัสออกหรือไม่?
กล่าวอีกนัยหนึ่งคือคอมไพล์กำลังติดตามไฟล์หรือไม่
คำตอบ:
ลอง:
git ls-files --error-unmatch <file name>
จะออกด้วย 1 หากไฟล์ไม่ถูกติดตาม
--error-unmatchตัวเลือกก่อนชื่อไฟล์เพื่อรับข้อผิดพลาด อย่างใดตัวเลือกจะนำไปใช้กับชื่อไฟล์ที่ตามมาเท่านั้น
--) ไฟล์--error-unmatchจะถือว่าเป็นชื่อไฟล์ (ไม่ใช่ในดัชนี) และไม่มีผลใด ๆ
git ls-files | grep <PATTERN>? ตัวอย่าง:git ls-files | grep Main.h
หากคุณไม่ต้องการถ่วงคอนโซลด้วยข้อความแสดงข้อผิดพลาดคุณสามารถเรียกใช้
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
แก้ไข
หากคุณต้องการใช้คอมไพล์จาก 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")
git status --porcelainคือเพื่อนของคุณถ้าคุณต้องการแยกวิเคราะห์ผลลัพธ์ด้วยสคริปต์ดูที่เอกสารที่เชื่อมโยงซึ่งแสดงตัวเลือกที่มีประโยชน์อื่น ๆ
git status --porcelain error: unknown option Porcelain 'Version 1.6.0 :-)
ลองรันgit statusไฟล์ มันจะพิมพ์ข้อผิดพลาดหากไม่ได้ติดตามโดย git
PS$> git status foo.txt
error: pathspec 'foo.txt' did not match any file(s) known to git.
git status trackedfileฉันได้รับรหัสทางออก 1 (คาดว่า 0 จะเป็นประโยชน์) แต่ก็ไม่ได้ให้ "ข้อผิดพลาด:" ในผลลัพธ์ ฉันต้องการแยกรหัสทางออกมากกว่าเอาท์พุทสตริง
.gitignore
$ git status notthere:On branch master nothing to commit, working directory clean
ฉันไม่รู้คำสั่ง git ใด ๆ ที่ให้รหัสทางออก "ไม่ดี" แต่ดูเหมือนว่าวิธีง่าย ๆ ที่จะทำคือใช้คำสั่ง git ที่ให้ผลลัพธ์สำหรับไฟล์ที่ไม่มีการติดตามเช่น git-log หรือ git-ls-files ด้วยวิธีนี้คุณไม่จำเป็นต้องทำการวิเคราะห์คำใด ๆ เลยคุณสามารถเรียกใช้งานผ่านยูทิลิตี้ง่ายๆอย่าง grep เพื่อดูว่ามีเอาต์พุตหรือไม่
ตัวอย่างเช่น,
git-ls-files test_file.c | grep
จะออกด้วยรหัสศูนย์หากไฟล์นั้นถูกติดตาม แต่รหัสทางออกของหนึ่งรหัสหากไฟล์นั้นไม่ถูกติดตาม
ผมขอแนะนำที่กำหนดเองนามแฝง.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
การใช้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#
แค่สองเซ็นต์ของฉัน:
git ls-files | grep -x relative/path
ซึ่งrelative/pathสามารถกำหนดได้อย่างง่ายดายโดยการกดtabภายในเชลล์เติมภาพอัตโนมัติ เพิ่มส่วนเพิ่มเติม| wc -l เพื่อรับเอาต์พุต 1 หรือ 0
grep --fixed-strings