كيف يمكنني الحصول على فرق بين كل ارتكاب حدثت بين تاريخين مع جيت؟

StackOverflow https://stackoverflow.com/questions/1161609

  •  18-09-2019
  •  | 
  •  

سؤال

أو فقط كل يرتكب التي حدثت بين تاريخين؟ في SVN، يمكنك أن تفعل شيئا مثل

svn diff -r{date}:{date}

للقيام بذلك! لا يبدو لي أن أجد مكافئ جيت لهذا.

على وجه التحديد أنا أبحث في كتابة برنامج نصي لإرسال رسائل البريد الإلكتروني اليومية مع كل الكود الملتزم به في ذلك اليوم ومنظمة الصحة العالمية.

هل كانت مفيدة؟

المحلول

يمكنك استخدام git whatchanged --since="1 day ago" -p

كما يأخذ --until جدال.

مستندات

نصائح أخرى

الاقتراحات السابقة لها بعض العيوب. أساسا، كنت أبحث عن شيء يعادل cvs diff -D"1 day ago" -D"2010-02-29 11:11". وبعد أثناء جمع المزيد والمزيد من المعلومات، وجدت حلا.

الأشياء التي جربتها:

  • git whatchanged --since="1 day ago" -p من هنا

    ولكن هذا يعطي فرق لكل الالتزام، حتى لو كان هناك عدة ارتكاب في ملف واحد. وأنا أعلم ذلك "التاريخ" قليلا من مفهوم فضفاض في جيت, أعتقد أنه يجب أن يكون هناك طريقة للقيام بذلك.

  • git diff 'master@{1 day ago}..master يعطي بعض التحذير warning: Log for 'master' only goes back to Tue, 16 Mar 2010 14:17:32 +0100. ولا يظهر كل فرق.

  • git format-patch --since=yesterday --stdout لا يعطي أي شيء بالنسبة لي.

  • revs=$(git log --pretty="format:%H" --since="1 day ago");git diff $(echo "$revs"|tail -n1) $(echo "$revs"|head -n1) يعمل بطريقة أو بأخرى، ولكن يبدو معقدا ولا تقيد الفرع الحالي.

أخيرا:

Funnily، لا يدعم GIT-CVSSERVER "CVS Diff -D" (بدون أنه يتم توثيقه في مكان ما).

"التاريخ" قليلا من مفهوم فضفاض في جيت. سيكون لدى الالتزام تاريخ مؤلف قد يكون بعض الوقت في الماضي قبل أن يسحب / يرتكب شخص ما في الواقع / يرتكب الالتزام في مستودعه، كما قد يتم تحديث الالتزام وتحديثها لتكون على رأس الالتزام الأحدث على ما يبدو.

يحتوي الالتزام أيضا على تاريخ الالتزام الذي يتم تحديثه إذا تم تمريد الالتزام أو تعديله بأي شكل من الأشكال. من المرجح أن تكون هذه اللجنة من المرجح أن تكون في نوع من الترتيب الزمني، لكنك لا تزال تحت رحمة المفتش العامية التي تم تعيين الوقت الصحيح على جهاز الكمبيوتر الخاص به وحتى ذلك، يمكن أن يجلس الالتزام غير المعفير في فرع ميزة على مستودع بعيد إلى أجل غير مسمى من قبل يتم دمجها في فرع الماجستير في مستودع مركزي.

ما هو الأكثر فائدة الأكثر فائدة لأغراضك هو التاريخ الإنجاز على مستودع معين في السؤال. إذا كان لديك تمكين الإنجازات لكل فرع (انظر git config core.logAllRefUpdates) ثم يمكنك استخدام ref@{date} بناء الجملة للإشارة إلى حيث كان الفرع في وقت معين.

على سبيل المثال

git log -p master@{2009-07-01}..master@{now}

يمكنك أيضا استخدام أوصاف "غامض" مثل:

git log -p "master@{1 month ago}..master@{yesterday}"

ستعرض هذه الأوامر جميع ارتكبها "ظهرت" في الفرع المحدد للتوزيع بغض النظر عن كيفية "القديم" أنها في الواقع وفقا لمؤلفها واتخاذ تواريخ.

لاحظ أن Accessog Accessog الخاص بفرع محدد خاص بالمستودع، لذلك إذا كنت تقوم بتشغيل أمر السجل على استنساخ، فلن تسحب ل (يقول) شهر ثم اسحب جميع التغييرات في الشهر الماضي في وقت واحد، ثم ستظهر جميع تغييرات الشهر الماضي في @{1 hour ago}..@{now} نطاق. إذا كنت قادرا على تشغيل أمر السجل على Repostory "المركزي" الذي يدفع الناس إليه، فيمكنه أن يفعل ما تريد.

git diff --stat @{2013-11-01}..@{2013-11-30}

أو

git diff --stat @{2.weeks.ago}..@{last.week}

ربما

$ git format-patch --committer=<who> --since=yesterday --stdout

هو ما تريد (مع أو بدون "--STDOUT")؟

أعتقد أن الحل العام هو استخدام:

git rev-list -n1 --first-parent --until=<a date string> <a ref>

بدون - الوالد، قد تحصل على الالتزام من فرع تم دمجه لاحقا في a ref لكن لم يتم دمجها اعتبارا من a date string.

هنا بديل باستخدام --children و grep بدلا من -n1:

mlm_git_ref_as_of() {
    # # Examples #
    #
    # Show all commits between two dates:
    #
    #     git log $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400')
    #
    # Show diffs of all commits between two dates:
    #
    #     git diff $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400')
    local as_of="$1"
    local ref="${2:-HEAD}"
    # Get the most recent commit (--children, grep -v ' ') that was on
    # the given branch ($ref, --first-parent) as of a given date
    # ($as_of)
    git rev-list --children --first-parent --until="$as_of" "$ref" | grep -v ' '
}

لم أكن على دراية git whatchanged قبل قراءة هذا Q & A، لكنه يعطي نتائج مختلفة جدا بالنسبة لي، لذلك أنا لست متأكدا مما تفعله.

طريقة أخرى بسيطة يمكنك الحصول على فرق من جميع التغييرات منذ تاريخ معين هي ببساطة العثور على الالتزام الأول X التي حدثت في أو بعد ذلك التاريخ، ثم استخدام

git diff X

هذا له ميزة أنه لا يعتمد على إدخالات استنساخ في استنساخ جديد، على عكس

git diff <reference>@{n}..
git log <reference>@{n}..

الحلول في

هذا هو إجابة مضحكة، لأن هناك من المحتمل أن تكون هناك طريقة أفضل. هذا سيظهر جميع الالتزام تجزيس اليوم.

git log --pretty="format:%H %ai" | grep `date +"%Y-%m-%d"` | awk {'print $1'}`

;·)

تستطيع ايضا استخذام جيت تنسيق التصحيح لإعداد بقع (DIFFS) وإرسالها عبر البريد الإلكتروني.

استخدم الخيارات [منذ] أو [Revision Range] لتحديد نطاق يرتكز.

سأرمي بالطريقة التي أفعلها:git log للحصول على موعد يمنحك ارتكاب التجزئة للفرع الحالي. ثم أنا فقط استخدام شيء مثل git diff 8fgdfg8..565k4l5 مما يعطيني الاختلاف المناسب مجمعة بواسطة الملفات. آمل أن يساعد هذا، وليس اختباره كثيرا

من أجل مشاهدة تغييرات الملفات من تاريخ إلى تاريخ على فرعك،استخدم الصيغة التالية:

  1. الخروج فرعك.
  2. سحب وتحديث التغييرات من مستودع عن بعد
  3. مشاهدة ملفات فرق من تاريخ إلى تاريخ

مثال:

git checkout <branch>
git pull
git diff --stat @{fromDate}..@a{toDate}

انتبه التواريخ في yyyy-mm-dd صيغة:

git diff --stat @{2019-08-20}..@a{2019-08-21}

إذا كنت ترغب في الالتزام التغييرات في ملف معين في نطاق زمني محدد (مشاهدة فرق في الكود)، فقط انتقل إلى الملف الحالي:

مثال:

git diff @{2019-01-01}..@{2019-01-02} ~/dev/myApp/package.json
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top