파일 변경시 자동 버전 관리 (수정 / 만들기 / 삭제)


16

디렉토리의 모든 변경 사항을 자동으로 투명하게 (재귀 적으로) 버전 화하는 메커니즘의 구현 (Linux)을 찾고 있습니다. 이것은 표준 버저 닝 (SVN, git, ...)에 추가하기위한 것입니다 (요청한 모든 기능을 사용할 수있는 경우 대체 가능).

이를 수행하는 MS Windows의 제품은 AutoVer입니다 (요구 사항을 더 잘 이해하기 위해). 나는 그런 것을 가지고 싶지만 그래픽이 아닌 환경에서 Linux를 목표로했습니다.

Linux 에서이 기능을 사용하려는 몇 가지 시도가 있다는 것을 알았습니다. 내가 찾은 가장 가까운 것은 Subversion에서 자동 버전 지정 이지만 기존 환경 (예 : 구성 파일이 로컬 인 서버)에서 구현하는 것은 분명하지 않습니다.

어쩌면 뭔가 일하고 inotify있습니까?

어떤 조언을 주셔서 감사합니다! 와우


관련 : flashbake
Dan D.


사용하는 소프트웨어에 대한 특별한 요구 사항이 있습니까? 파일을 편집하여 수동으로 수행 한 변경 사항 만 추적하려는 경우 Eclipse에는이 기능이 내장되어 있으며 "로컬 히스토리"라고합니다.
Stefan Seidel 2013

@StefanSeidel 주제를 시작하는 사람은 아니지만 비 IDE 솔루션을 선호합니다.
Michael Pankov

답변:


6

1. 시장 및 이노 파이를 이용한 범용 방법

이것은 나에 의해 테스트되지 않았지만 (bazaar)를 사용 하고 디렉토리를 모니터링하고 bazaar를 사용하여 파일을 버전 제어하는 이 쓰기를 발견 했습니다.bzrinotifywait

이 스크립트는 디렉토리의 변경 사항을 관찰하는 모든 작업을 수행합니다.

#!/bin/bash

# go to checkout repository folder you want to watch
cd path/to/www/parent/www
# start watching the directory for changes recusively, ignoring .bzr dir
# comment is made out of dir/filename
# no output is shown from this, but wrinting a filename instead of /dev/null 
# would allow logging
inotifywait –exclude \.bzr -r -q -m -e CLOSE_WRITE \
    –format=”bzr commit -m ‘autocommit for %w/%f’” ./ | \
    sh  2>/dev/null 1>&2 &
# disown the pid, so the inotify thread will get free from parent process
# and will not be terminated with it
PID=`ps aux | grep inotify | grep CLOSE_WRITE | grep -v grep | awk ‘{print $2}’`
disown $PID

# this is for new files, not modifications, optional
inotifywait –exclude \.bzr -r -q -m -e CREATE \
    –format=”bzr add *; bzr commit -m ‘new file added %w/%f’” ./ | \
    sh  2>/dev/null 1>&2 &
PID=`ps aux | grep inotify | grep CREATE | grep -v grep | awk ‘{print $2}’`
disown $PID

exit 0;

2. / etc 관리

시스템 /etc디렉토리 를 관리하는 특별한 경우 에는 app etckeeper를 사용할 수 있습니다 .

etckeeper는 / etc를 git, mercurial, darcs 또는 bzr 저장소에 저장하는 도구 모음입니다. 패키지 업그레이드 중에 / etc에 대한 변경 사항을 자동으로 커밋하기 위해 apt (및 yum 및 pacman-g2를 포함한 다른 패키지 관리자)에 연결됩니다. 개정 제어 시스템이 일반적으로 지원하지 않지만 / etc / shadow의 권한과 같이 / etc에 중요한 파일 메타 데이터를 추적합니다. 모듈 식이며 구성이 가능하며 개정 제어 작업의 기본 사항을 이해하면 사용하기도 쉽습니다.

다음은 시작하기에 좋은 자습서 입니다.

3. 자식과 incron 사용하기

이 기술은 git및 을 사용 incron합니다. 이 방법을 사용하려면 다음을 수행해야합니다.

A. 리포지토리 만들기

% mkdir $HOME/git
% cd $HOME/git
% git init

B.는 크리에이트 $HOME/bin/git-autocommit스크립트를

#!/bin/bash

REP_DIR="$HOME/git"       # repository directory
NOTIFY_DIR="$HOME/srv"    # directory to version

cd $REP_DIR
GIT_WORK_TREE=$NOTIFY_DIR /usr/bin/git add .
GIT_WORK_TREE=$NOTIFY_DIR /usr/bin/git commit -a -m "auto"

C. incrontab에 항목 추가

% sudo incrontab -e $HOME/srv IN_MODIFY,IN_CREATE,IN_MOVED_FROM,IN_MOVED_TO $HOME/bin/git-autocommit

4. 플래시 베이크 사용

또 다른 옵션은 Flashbake 와 같은 도구를 사용하는 것 입니다. Flashbake는 BoingBoing 명성의 Cory Doctorow가 자신의 책을 쓰는 데 사용하는 버전 관리 시스템입니다.

Flashbake는 후드 아래에서 git을 사용하여 변경 사항을 추적하지만 자동 백업과 일반 버전 제어 시스템을 직접 사용하는 것 사이에 있습니다.

Cory는 버전이 프롬프트, 자동 커밋이 발생한 시점의 스냅 샷 및 생각한 내용을 전달하기를 원했습니다. 필자는 원하는 컨텍스트 정보를 얻기 위해 Python 스크립트를 신속하게 스케치하고 cron 작업이 쉘 랩퍼를 호출했을 때 커밋 주석에 대한 Python 스크립트 출력을 사용하여 쉘 스크립트를 함께 해킹하여 git을 구동하기 시작했습니다.

자원


3
inotifywait + "git local"= gitwatch.sh, 여기를보십시오 : github.com/nevik/gitwatch/blob/master/gitwatch.sh
diyism


3

나는 당신이 올바른 길을 가고 있다고 생각합니다 inotify. 이 기사에서는 귀하와 유사한 경우의 기본 사용법에 대해 자세히 설명합니다. 직접 사용하거나 fschange 와 같은 커널 수준 유틸리티를 컴파일하는 것이 좋습니다 . 이것은 번거로운 일이지만 변경 사항 감지 git commit또는 유사한 항목 을 바인딩 할 수 있습니다.

이러한 솔루션은 모두 다소 불완전한 타사 솔루션에 의존하는 문제가 있습니다. 손이 더러워지는 것을 좋아하지 않는다면 NodeJS 는 이러한 정확한 목적을 위해 뛰어난 크로스 플랫폼 기능 ( fs.watch )을 제공합니다. NodeJS의 변경 사항에 대한 파일보기에 대한 기본 학습은 여기 에서 찾을 수 있습니다 . 수십 줄 이하에서 파일의 디렉토리를 감시 한 다음 ( child_process 를 통해 ) 셸 아웃 하고 git commit비슷한 것을 실행 하거나 롤 파일을 원한다면 버전 파일 색인을 수동으로 증가시키는 것을 작성할 수 있습니다. 자신의 접근 방식).

fs.watch지원을받습니다 inotify리눅스에서,하지만 훨씬 더 직관적으로 사용하는 것입니다. 다른 NodeJS 프로젝트가 있습니다 그 랩이 파일보고 등의 편의 다양한 수준에서 기능 이 하나 또는 이 하나 .


여전히 준비된 솔루션이 아니며, 아마도 파이썬과 함께 갈 것입니다 inotify. 하지만 고마워
Michael Pankov

3

Linux에서 inotify (2)는 큰 트리를 볼 수 없지만 파일 시스템 요청을 svn 또는 git 호출로 변환하거나 svn / git 메타 데이터를 직접 변경하여 퓨즈 파일 시스템 (별도의 위치에 마운트 된)이이를 처리 할 수 ​​있습니다.

이것은 매우 흥미로운 아이디어이지만 기존 구현에 대해서는 들어 본 적이 없습니다.


파일이 두 개만 있다고 가정 해 봅시다.
Michael Pankov

0

이러한 스크립트는 작성하기 어렵지 않습니다.

내가 가장 좋아하는 버전은 git입니다.

다음 스크립트가해야합니다.

#!/bin/sh
git add .
git commit -am "my automatic commit"

디렉토리를 주기적으로 확인하거나 저장 후 편집기가 스크립트 가능한 호출인지 확인하십시오.

그러나 이렇게하면 큰 파일과 자동 저장과 같은 "무용 지 않은"파일을 제외하는 것이 좋습니다.


예, cron 기반 솔루션이 구현하기 쉽다는 것을 알고 있습니다. 그러나 저장 메커니즘에 관계없이 저장시 버전이 될 무언가를 찾고 있습니다. 이것이 내가 svn에서 autoversionninf를 언급하고 내 질문에 inotify를 언급 한 이유입니다.
WoJ

0

SparkleShare ( http://sparkleshare.org )는 git을 기반으로하며 버전 제어를 통해 Dropbox-Like 기능을 구현하지만 ssh-server를 설정해야합니다 (localhost 일 수 있음).


이 작업은 어색하고 많은 설정이 필요합니다. 또한 Dropbox 기능이 필요하지 않습니다.
Michael Pankov


0

rsync와 cron 작업 만 사용하여이를 수행하는 "가난한 사람"방법도 있습니다. 기본적으로 rsync의 백업 기능을 사용하고 두 개의 별도 경로와 접두사 / 접미사를 사용하여 파일을 추적합니다.

/ usr / bin / rsync -a -A -X --backup --suffix = date +".%Y-%m-%d_%H-%M-%S"$ source_path $ backup_path

최종 결과 : 초기 실행 후 소스 경로에서 test_rsync라는 파일을 변경하면 백업 경로에 test_rsync.2017-02-09_11-00-01이라는 파일이 생성됩니다.

이것에는 많은 문제가 있습니다 (적당한 양의 파일 만 있고 rsync의 두 번의 연속 실행 (내 경우에는 1 분) 사이에 변경 사항이 발생하면 작동하지만 필요에 충분할 수 있습니다).

우리가 삼바 주식에 대해 여기에서 이야기하는 경우 제외 목록이 순서에있을 수 있습니다. 아직 두려워하지 않습니다.

이것을 개선하면 알려주십시오.


0

다음은 저장할 때 원래 파일 이름에 추가 된 타임 스탬프를 사용하여 자동 파일 버전 관리와 같은 VMS를 수행하는 Python3 스크립트입니다.

스크립트에 많은 주석을 넣고 우분투 컴퓨터에서 스크립트 수십 개를 실행하여 스크립트의 각 버전마다 다른 디렉토리 만 사용하여 여러 디렉토리의 버전을 동시에 관리합니다. 기계 성능에 실질적인 불이익이 없습니다.

! / usr / bin / env python3

print ( "PROJECT FILES VERSIONING STARTED") print ( "version_creation.py") #이 코드를이 이름의 스크립트에 넣습니다 print ( "run as .. '명령 행에서'python3 version_creation.py '") print ( "ctrl' c 'to stop ") print (" ") print ("아래 배경 유형의 프로그램을 명령 행으로 실행 한 다음 창을 닫으려면 ""print ( "nohup python3 version_creation.py") print ( ".... to 프로세스 중지 메뉴 / 관리 / 시스템 모니터로 이동하고 python3을 종료하십시오. ") print (" ") print ("항상 파일을 'ProjectFiles'디렉토리에 저장하고 버전 파일 ") print ("도 해당 디렉토리에 생성됩니다. " . ") 인쇄 (" ") 인쇄 (" ") 인쇄 (" ") 인쇄 (" ")

수입 셔틀 수입 OS 수입 시간

--- 아래에서 새 파일을 확인하는 시간 간격을 초 단위로 설정하십시오.

-이 간격은 새 파일이 나타나는 간격보다 작아야합니다!

t = 10

--- 소스 디렉토리 (dr1)와 대상 디렉토리 (dr2)를 설정합니다

dr1 = "/ path / to / source_directory"

dr2 = "/ path / to / target_directory"

수 입구 수입 수입 OS

dr1 = "/ home / michael / ProjectFiles"# 원본과 버전이이 디렉토리에 저장됩니다

dr2 = "/ home / michael / ProjectFileVersions"

진실한 동안 :

if os.listdir(dr1) == []:

인쇄 ( "빈")

    n = 100
else:
    list_of_files = glob.glob(dr1+'/*')   # * means all if need specific format then *.csv
    latest_file_path = max(list_of_files, key=os.path.getctime)

인쇄 ( "1 Latest_file_path =", latest_file_path)

    originalname = latest_file_path.split('/')[-1]

인쇄 ( "2 원본 이름 =", 원본 이름)

    filecreation = (os.path.getmtime(latest_file_path))

인쇄 ( "filecreation =", filecreation)

    now = time.time()
    fivesec_ago = now - 5 # Number of seconds

인쇄 ( "fivesec_ago =", fivesec_ago)

    timedif = fivesec_ago - filecreation #time between file creation

인쇄 ( "timedif =", timedif)

    if timedif <= 5: #if file created less than 5 seconds ago

        nameroot = originalname.split(".")[-0]
        print ("3 nameroot= ", nameroot)

        extension = os.path.splitext(originalname)[1][1:]
        print ("4 extension = ", extension)

        curdatetime = time.strftime('%Y%m%d-%H%M%S')
        print ("5 curdatetime = ", curdatetime)

        newassembledname = (nameroot + "_" + curdatetime + "." + extension)
        print ("6 newassembledname = ", newassembledname)



        source = dr1+"/"+originalname
        print ("7 source = ", source)

        target = dr1+"/"+newassembledname
        print ("8 target = ", target)

        shutil.copy(source, target)


    time.sleep(t)

공유

아래는 이전에 넣고 작동했지만 위의 파이썬 스크립트가 훨씬 좋습니다 ... (파이썬을 약 3 시간 동안 사용했습니다)

#!/usr/bin/env python3

print ("PROJECT FILES VERSIONING STARTED")
print ("projectfileversioning.py")
print ("run as..  'python3 projectfileversioning.py'       from command line")
print ("ctrl 'c'      to stop")
print (" ")
print ("To run program in background type below to command line and then close the window. ")
print ("nohup python3 projectfileversioning.py")
print ("....to stop process go menu/administration/system monitor... and kill python")
print (" ")
print ("Always save files to the 'ProjectFiles' directory and the file ")
print ("   will be redirected to the ProjectFileVersions where")
print ("   time stamped versions will also be created.")
print (" ")
print ("If you like you may then copy/move the versioned and original file from 'ProjectFileVersions' to ")
print ("any other directory you like.")

import shutil
import os
import time

#--- set the time interval to check for new files (in seconds) below 
#-   this interval should be smaller than the interval new files appear!
t = 10

#--- set the source directory (dr1) and target directory (dr2)
#dr1 = "/path/to/source_directory"
#dr2 = "/path/to/target_directory"

import glob
import os

dr1 = "/home/michael/ProjectFiles"
dr2 = "/home/michael/ProjectFileVersions"


while True:

    if os.listdir(dr1) == []:
        n = 100
    else:
        list_of_files = glob.glob(dr1+'/*')   # * means all if need specific format then *.csv
        latest_file_path = max(list_of_files, key=os.path.getctime)
        print ("1 Latest_file_path = ", latest_file_path)

        originalname = latest_file_path.split('/')[-1]
        print ("2 originalname = ", originalname)

        nameroot = originalname.split(".")[-0]
        print ("3 nameroot= ", nameroot)

        extension = os.path.splitext(originalname)[1][1:]
        print ("4 extension = ", extension)

        curdatetime = time.strftime('%Y%m%d-%H%M%S')
        print ("5 curdatetime = ", curdatetime)

        newassembledname = (nameroot + "_" + curdatetime + "." + extension)
        print ("6 newassembledname = ", newassembledname)




        source = dr1+"/"+originalname
        print ("7 source = ", source)

        target = dr2+"/"+originalname
        print ("8 target = ", target)

        shutil.copy(source, target)



        source = dr1+"/"+originalname
        print ("9 source = ", source)

        target = dr2+"/"+newassembledname
        print ("10 target = ", target)

        shutil.move(source, target)
        time.sleep(t)


#share
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.