태그 보관물: versioning

versioning

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

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

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

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

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

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



답변

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을 구동하기 시작했습니다.

자원


답변

즉시 ZFS 오릅니다. 스냅 샷을 작성할 수 있으며 스냅 샷을 자동으로 작성 하는 프로젝트가 있습니다 .


답변

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

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

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


답변

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

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


답변

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

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

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

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

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

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


답변

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


답변

NILFS를 사용해 보는 것이 좋습니다. about 페이지를 참조하면 이것이 당신이 찾고있는 것인지 아닌지를 결정할 수 있습니다.

HTH