如何忽略除单个文件之外的git仓库子目录中的所有内容?

时间:2018-07-18 20:22:00

标签: git gitignore

我有一个带有名为mod /的子目录的存储库。我希望将此子目录与其中的README文件一起包含在存储库中,但我不希望在mod /中包含其他子目录。我已经尝试使用.gitignore并提交更改来提出here的一些修补程序,但是 import React from 'react'; import { ActivityIndicator, AsyncStorage, Button, StatusBar, StyleSheet, View, } from 'react-native'; import { StackNavigator, SwitchNavigator } from 'react-navigation'; // Version can be specified in package.json class SignInScreen extends React.Component { static navigationOptions = { title: 'Please sign in', }; render() { return ( <View style={styles.container}> <Button title="Sign in!" onPress={this._signInAsync} /> </View> ); } _signInAsync = async () => { await AsyncStorage.setItem('userToken', 'abc'); this.props.navigation.navigate('App'); }; } class HomeScreen extends React.Component { static navigationOptions = { title: 'Welcome to the app!', }; render() { return ( <View style={styles.container}> <Button title="Show me more of the app" onPress={this._showMoreApp} /> <Button title="Actually, sign me out :)" onPress={this._signOutAsync} /> </View> ); } _showMoreApp = () => { this.props.navigation.navigate('Other'); }; _signOutAsync = async () => { await AsyncStorage.clear(); this.props.navigation.navigate('Auth'); }; } class OtherScreen extends React.Component { static navigationOptions = { title: 'Lots of features here', }; render() { return ( <View style={styles.container}> <Button title="I'm done, sign me out" onPress={this._signOutAsync} /> <StatusBar barStyle="default" /> </View> ); } _signOutAsync = async () => { await AsyncStorage.clear(); this.props.navigation.navigate('Auth'); }; } class AuthLoadingScreen extends React.Component { constructor() { super(); this._bootstrapAsync(); } // Fetch the token from storage then navigate to our appropriate place _bootstrapAsync = async () => { const userToken = await AsyncStorage.getItem('userToken'); // This will switch to the App screen or Auth screen and this loading // screen will be unmounted and thrown away. this.props.navigation.navigate(userToken ? 'App' : 'Auth'); }; // Render any loading content that you like here render() { return ( <View style={styles.container}> <ActivityIndicator /> <StatusBar barStyle="default" /> </View> ); } } const styles = StyleSheet.create({ container: { flex: 1, alignItems: 'center', justifyContent: 'center', }, }); const AppStack = StackNavigator({ Home: HomeScreen, Other: OtherScreen }); const AuthStack = StackNavigator({ SignIn: SignInScreen }); export default SwitchNavigator( { AuthLoading: AuthLoadingScreen, App: AppStack, Auth: AuthStack, }, { initialRouteName: 'AuthLoading', }`enter code here` ); 仍然显示mod /中的所有内容均已被跟踪。目前,我的.gitignore包含:

git status

但是我也尝试将第一行设置为:

mod/* # Ignore everything in 'mod'...
!mod/README.md # ... except this.

和其他一些变化...

要在每次编辑.gitignore时“应用”这些设置,请运行:

/mod
mod/
./mod
./mod/*

,状态继续显示mod /中未跟踪的文件。

2 个答案:

答案 0 :(得分:2)

没有例外。只需忽略整个目录(使用mod/*),然后

git add -f mod/README.md
git commit

-f告诉git覆盖此文件的忽略。它将继续被git跟踪,而忽略其他所有内容。

之所以可行,是因为.gitignore仅确定git如何处理未跟踪的文件。如果您强制git使用-f来跟踪文件,则该文件位于忽略文件中的事实是无关紧要的。

答案 1 :(得分:2)

我可以想到三个直观的选择:

  1. .gitignore添加一个单独的mod

    *
    !README.md
    
  2. 使用您的根级别.gitignore,并且每行仅 个规则或注释,但不能同时使用这两个级别:

    ./mod/*
    !./mod/README.md
    

    我在这里使用./前缀来强调,但这不是严格必要的。由于这些路径都包含一个非结尾的斜杠,因此无论如何它们都将相对于.gitignore的目录进行解释。

  3. 对于肯定的规则不要使用.gitignore:忽略mod,然后这样做

    git add -f mod/README.md
    

    Git继续跟踪使用-f/--force标志添加的任何文件。