2013-04-17 11 views
6

पहला: मुझे सामान्य टिप्पणी के बारे में पता है: जेनरेट की गई फ़ाइलों को ट्रैक न करें।गिट को पीडीएफ फाइलों में दिनांक को अनदेखा करें

कहें, मैं जेनरेट किए गए पीडीएफ ट्रैक करना चाहता हूं और पीडीएफ में लिखी गई तारीख को अनदेखा कर दूंगा। इसका मतलब है, मैं चाहता हूं कि गिट दो पीडीएफ के समान व्यवहार करे, यदि केवल अंतर ही तारीख की जानकारी है।

मैंने जो कोशिश की वह एक फ़िल्टर है - इसके स्वच्छ हिस्से में - कुछ मनमाना मूल्य की तिथि निर्धारित करता है।

(--- टिप्पणी ----
मूल रूप से, फिल्टर करता है साथ sth:

## dump the pdf metadata to a file and replace the dates 
pdftk "$FILENAME" dump_data | sed -e '{N;s/Date\nInfoValue: D:.*/Date\nInfoValue: D:19790101072619/}' > "$TMPFILE" 

## update the pdf metadata 
pdftk "$FILENAME" update_info "$TMPFILE" output "$TMPFILE2" 

) --- अंत टिप्पणी ----

फिल्टर काम करता है (प्रतिबद्ध पीडीएफ की तारीख मेरे मनमानी मूल्य पर सेट है) लेकिन मैं files re-checked out from git repository with 'clean' filter end up with modified status

में चला गया तो, मेरा फ़िल्टर जाहिर है कि मैं यहां क्या करना चाहता हूं।

मेरा प्रश्न है:
1) क्या मैं पीडीएफ में दिनांक मूल्यों को पूरी तरह से अनदेखा करने के लिए एक चालाक फ़िल्टर दृष्टिकोण का उपयोग कर सकता हूं? और कैसे?
या
2) फिल्टर नहीं होने पर सही दृष्टिकोण क्या होगा?

उत्तर

1

अंततः गिट मेलिंग सूची से सहायता के साथ हल किया। सब के बाद एक गिट मुद्दा नहीं था, लेकिन पीडीएफटीके की मेरी फिल्टर अपेक्षाओं की एक और समस्या थी। (? हो सकता है कि कोई एन्कोडिंग बात और गहराई में नहीं था।)

Git मेलिंग सूची पर उपयोगी संदेश यहाँ है: http://permalink.gmane.org/gmane.comp.version-control.git/224797

असल में, फिल्टर स्क्रिप्ट मैंने लिखा इडेम-शक्तिशाली नहीं था, जिसका अर्थ है कि आवेदन करने वाले एक साफ फ़ाइल में दूसरी बार साफ फ़िल्टर फ़ाइल को बदल देगा।

पृष्ठभूमि: जब पीडीएफटी के पीडीएफ के मेटाडेटा को अद्यतन करने के लिए पीडीएफटीके का उपयोग किया जाता है, तो यह उस सटीक पीडीएफ से पहले निकाला जाता है, मेरे आश्चर्य से यह पीडीएफ फ़ाइल बदलता है।

इसलिए, मैंने अपने फ़िल्टर में सुरक्षा जांच शामिल की और समस्या दूर हो गई है।

#!/bin/bash 

## use GNU coreutils on OS X explicitely 
## (install via homebrew, for instance: 
## > brew install coreutils 
## > brew install gnu-sed 
##) 
if [ ${OSTYPE:0:6} == "darwin" ]; then 
    MKTMP=gmktemp 
    SED=gsed 
else 
    MKTMP=mktemp 
    SED=sed 
fi 


FILEASARG=true 
if [ "$#" == 0 ]; then 
    FILEASARG=false 
fi 

if $FILEASARG ; then 
    FILENAME="$1" 
else 
    FILENAME=`$MKTMP` 
    cat /dev/stdin > "${FILENAME}" 
fi 

TMPFILE=`$MKTMP` 
TMPFILE2=`$MKTMP` 
TMPFILE3=`$MKTMP` 

## dump the pdf metadata to a file and replace the dates 
pdftk "$FILENAME" dump_data > "$TMPFILE3" 
$SED -e '/Date/{ N; s/Date\nInfoValue: D:.*/Date\nInfoValue: D:19790101072619/ }' < "$TMPFILE3" > "$TMPFILE" 

## if the metadata did not change, do nothing 
if diff "$TMPFILE3" "$TMPFILE"; then 
    rm "$TMPFILE3" 
    rm "$TMPFILE" 
    if [ -n $FILEASARG ] ; then 
    cat "$FILENAME" 
    fi 
    exit 0 
fi 

## update the pdf metadata 
pdftk "$FILENAME" update_info "$TMPFILE" output "$TMPFILE2" 

## overwrite the original pdf 
mv -f "$TMPFILE2" "$FILENAME" 

## clean up 
rm -f "$TMPFILE" 
rm -f "$TMPFILE2" 
if [ -n $FILEASARG ] ; then 
    cat "$FILENAME" 
fi 
+0

आपने अपनी स्क्रिप्ट को बेवकूफ़ बना दिया? मुझे एक ही समस्या का सामना करना पड़ रहा है। – rodion

+0

मेरा सरल समाधान एक स्पष्ट जांच था: '## अगर मेटाडेटा नहीं बदला, तो कुछ भी नहीं करें अगर" $ TMPFILE3 "" $ TMPFILE "भिन्न हो; फिर आरएम "$ TMPFILE3"; आरएम "$ TMPFILE"; यदि [-एन $ FILEASARG]; तो \t बिल्ली "$ FILENAME" fi बाहर निकलेंfi '(खराब प्रारूपण के लिए खेद है ...) – Andreas

0

यदि आप पीडीएफ पीढ़ी के नियंत्रण में हैं, तो आप पीढ़ी के पीडीएफ कीवर्ड में पीडीएफ फाइल की सामग्री के हैश को इंजेक्शन देने पर विचार कर सकते हैं। यह हैश तिथि क्षेत्र के लिए लेखांकन के बिना पीडीएफ फ़ाइल की विशिष्ट पहचान करेगा।

फिर गिट साइड पर, आप jury rig something in .gitattributes (पीडीएफ फ़ाइल पर extract -p keywords का उपयोग करके) पीडीएफ फ़ाइल पर बाइनरी diff करने के लिए कर सकते हैं।

मुझे लगता है कि यह काम कर सकता है।

+0

इस विचार के लिए धन्यवाद:

संदर्भ के लिए, पूर्ण फिल्टर है। यह एक मजबूत समाधान होगा। मैं वास्तव में पीडीएफ पीढ़ी के नियंत्रण में हूं, लेकिन मैं इसके साथ हस्तक्षेप नहीं करना चाहता हूं बल्कि इसके बजाय गिट कॉन्फ़िगर करना चाहता हूं। अगर मैं पीडीएफ पीढ़ी के साथ गड़बड़ करने के लिए गया, तो पीडीएफ पीढ़ी के दौरान तिथियां निर्धारित करने के लिए एक सरल (और कम मजबूत) दृष्टिकोण होगा। – Andreas

+0

एचएम। यदि आपके पीडीएफ बेहद मानक हैं, तो आप भाग्यशाली हो सकते हैं, और वास्तव में पीडीएफटीओटीएक्स से उपयोग करने योग्य आउटपुट प्राप्त कर सकते हैं।यदि ऐसा है तो आप पीडीएफ के सादा पाठ प्रतिनिधित्व पर एक sed smudge/clean के साथ गिट के बाइनरी diff का उपयोग कर सकते हैं। मुझे लगता है कि gitattributes में बाइनरी diff आपके मुद्दे के समाधान में सबसे आशाजनक तत्व है। या तो, या यदि आपकी पीडीएफ पीढ़ी टेम्पलेट-आधारित है, तो टेम्पलेट से टेक्स्ट निकालें और यह निर्धारित करने के लिए कि जेनरेट किए गए पीडीएफ (दोनों तरफ गिट साइड में संग्रहीत) बदल गए हैं, एक gitattributes फ़िल्टर में इसका उपयोग करें। – JosefAssad

संबंधित मुद्दे